Перейти к содержанию

Как ждать окончания процесса поражденного clone() ????


Гость

Рекомендуемые сообщения

Как ждать окончания процесса поражденного 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;

}

Ссылка на комментарий
Поделиться на другие сайты

Слушай, я ттекст программы зря кидал?

Вот протокол работы (если тебе так трудно её откомпилить):

Отец до 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

Ссылка на комментарий
Поделиться на другие сайты

#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 ;

}

Ссылка на комментарий
Поделиться на другие сайты

Я не телепат, и не знаю что ты имен ввиду.

И если ты пытаешься помочь, то делай это хорошо или не делай вообще.

Это конечно правильно, что ты направляешь человека читать маны, НО допустим человек человек работает в Linux только пару дней, тогда товое man wait, ему точно не поможет.

И в следующи раз читай вопрос до конца.

Ссылка на комментарий
Поделиться на другие сайты

сделай #include

а в waitpid options = __WCLONE

правда только для 2.4 ядра, как в 2.2 сделать не знаю.

но если припрет то напиши - поищу.

PS:

ты чего такой суетной? люди ведь еще работают впаралель.

Ссылка на комментарий
Поделиться на другие сайты

В свою очередь хочу порекомендовать

все-таки читать иногда 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, то тогда вообще не знаю чего

ты кипишь.

Ссылка на комментарий
Поделиться на другие сайты

Извините, товарищ дорогой, который якобы несколько дней всего в

Linuxе работает (?): а зачем вам вообще clone сдался? IMHO,

для людей, *не* пишущих реализацию POSIX threads, он как бы

ни к чему. Есть fork() и есть собственно POSIX threads API.

Э?

Ссылка на комментарий
Поделиться на другие сайты

Вам парвдо интересно, или вы просто так спросили?

Ну а асли мне нужно нечто промежуточное между процессом и нитью?

Если мне надо разделить между процессами только таблицу дискрипторов открытых файлов, а память разделять между ними не надо, и тем более не надо раздилять таблицу обработчиков сигналов.

Ссылка на комментарий
Поделиться на другие сайты

Мне и правда было интересно, кому и зачем может понадобиться clone.

Вольному воля, конечно... Вопрос номер следующий: а зачем разделять

таблицу файловых дескрипторов?

Ссылка на комментарий
Поделиться на другие сайты

Очевидно, что в Unix системах, практически любую задачу можно решить несколькими различными способами. Так например можно вообще не использовать нити, а все делать с помощью fork-exec-IPC.

В конечном счете механизм реализации выбирает разработчик изходя из поставленной задачи(Если только этот механизм не был четко определен в ТЗ).

Давай я тебе сразу ТЗ выложу, ты его реализуешь и срубишь бабла. Smile

Ссылка на комментарий
Поделиться на другие сайты

  • 8 месяцев спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...