Гость Опубликовано 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 Слушай, я ттекст программы зря кидал? Вот протокол работы (если тебе так трудно её откомпилить): Отец до 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 Извините, товарищ дорогой, который якобы несколько дней всего в 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 Да кто ж спорит. Просто интересно знать, для каких задач стоит заморачиваться с нестандартным кодом.... Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.