Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Как ждать окончания процесса поражденного clone() ???? #include #include #include #include int clone_fn(void *); int main (int argc, char **argv) { int i[255]; // Понятие не имею какого размера нужен child_stack int cl_ret,status; printf("Отец до clone PID = %d\n",getpid()); cl_ret=clone(clone_fn,(void *) &i,CLONE_FS, (void *) argv[1] ); //для 2.2 cl_ret=__clone(clone_fn,(void *) &i,CLONE_FS, (void *) argv[1] ); printf("Function clone returm = %d\n",cl_ret); if (cl_ret<0) { perror("Clone error 1:"); return -1;} if (wait(&status)<0) perror("Wait error 1:"); // if (wait(cl_ret,&status,0)<0) perror("Wait error 1:"); printf("Отец до wait PID = %d\n",getpid()); sleep(1); system("ps -l"); return 0; } int clone_fn(void * arg) { printf("This is Clone! PID=%d PPID=%d\n",getpid(),getppid() ); return 0; } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 man wait man waitpid Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Слушай, я ттекст программы зря кидал? Вот протокол работы (если тебе так трудно её откомпилить): Отец до clone PID = 4067 Function clone return = 4068 Wait error 1:: No child processes Отец после wait PID = 4067 This is Clone! PID=4068 PPID=4067 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 000 S 501 3196 3096 0 69 0 - 695 wait4 pts/2 00:00:00 bash 000 S 501 4067 3196 0 70 0 - 312 wait4 pts/2 00:00:00 a.out 044 Z 501 4068 4067 0 69 0 - 0 do_exi pts/2 00:00:00 a.out 000 R 501 4069 4067 0 74 0 - 784 - pts/2 00:00:00 ps This is SIGCHLD handler PID=4067 PPID=3196 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 #include #include #include #include #include int clone_fn(void *); void sigchld_hand(); int main (int argc, char **argv) { int i[255]; // Понятие не имею какого размера нужен child_stack int cl_ret,status; signal(SIGCHLD,sigchld_hand); printf("Отец до clone PID = %d\n",getpid()); cl_ret=clone(clone_fn,(void *) &i,CLONE_FS, (void *) argv[1] ); //для 2.2 cl_ret=__clone(clone_fn,(void *) &i,CLONE_FS, (void *) argv[1] ); printf("Function clone return = %d\n",cl_ret); if (cl_ret<0) { perror("Clone error 1:"); return -1;} if (wait(&status)<0) perror("Wait error 1:"); // if (waitpid(cl_ret,&status,0)<0) perror("Wait error 1:"); printf("Отец после wait PID = %d\n",getpid()); sleep(1); system("ps -l"); return 0; } int clone_fn(void * arg) { printf("This is Clone! PID=%d PPID=%d\n",getpid(),getppid() ); return 0; } void sigchld_hand() { printf("This is SIGCHLD handler PID=%d PPID=%d\n",getpid(),getppid() ); return ; } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 vvv_ писал(а): > > man wait > man waitpid а вот man wait мне зачем?? надо man 2 wait Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 > надо man 2 wait я его и имел ввиду. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Я не телепат, и не знаю что ты имен ввиду. И если ты пытаешься помочь, то делай это хорошо или не делай вообще. Это конечно правильно, что ты направляешь человека читать маны, НО допустим человек человек работает в Linux только пару дней, тогда товое man wait, ему точно не поможет. И в следующи раз читай вопрос до конца. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Если да покажи, что надо поправить в тексте. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 сделай #include а в waitpid options = __WCLONE правда только для 2.4 ядра, как в 2.2 сделать не знаю. но если припрет то напиши - поищу. PS: ты чего такой суетной? люди ведь еще работают впаралель. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 В свою очередь хочу порекомендовать все-таки читать иногда man. там ясно написано про этот вопрос - man 2 waitpid __WCLONE Wait for "clone" children only. If omitted then wait for "non-clone" children only. (A "clone" child is one which delivers no signal, or a signal other than SIGCHLD to its parent upon termination.) This option is ignored if __WALL is also specified. ну а если у тебя старые man, то тогда вообще не знаю чего ты кипишь. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Спасибо Огромное Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Извините, товарищ дорогой, который якобы несколько дней всего в Linuxе работает (?): а зачем вам вообще clone сдался? IMHO, для людей, *не* пишущих реализацию POSIX threads, он как бы ни к чему. Есть fork() и есть собственно POSIX threads API. Э? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 ноября, 2003 Жалоба Поделиться Опубликовано 20 ноября, 2003 Вам парвдо интересно, или вы просто так спросили? Ну а асли мне нужно нечто промежуточное между процессом и нитью? Если мне надо разделить между процессами только таблицу дискрипторов открытых файлов, а память разделять между ними не надо, и тем более не надо раздилять таблицу обработчиков сигналов. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 24 ноября, 2003 Жалоба Поделиться Опубликовано 24 ноября, 2003 Мне и правда было интересно, кому и зачем может понадобиться clone. Вольному воля, конечно... Вопрос номер следующий: а зачем разделять таблицу файловых дескрипторов? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 24 ноября, 2003 Жалоба Поделиться Опубликовано 24 ноября, 2003 Очевидно, что в Unix системах, практически любую задачу можно решить несколькими различными способами. Так например можно вообще не использовать нити, а все делать с помощью fork-exec-IPC. В конечном счете механизм реализации выбирает разработчик изходя из поставленной задачи(Если только этот механизм не был четко определен в ТЗ). Давай я тебе сразу ТЗ выложу, ты его реализуешь и срубишь бабла. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 25 ноября, 2003 Жалоба Поделиться Опубликовано 25 ноября, 2003 Да кто ж спорит. Просто интересно знать, для каких задач стоит заморачиваться с нестандартным кодом.... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 18 августа, 2004 Жалоба Поделиться Опубликовано 18 августа, 2004 link Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.