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

Как отследить форкнутый процесс


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

Пытаюсь написать фильтр к внешней программе (например popa3d).

юзер <--> фильтр <--> popa3d

все работают через стандартный вход/выход.

Создаю пайпы на вход/выход, форкаю popa3d, dup'лю вход/выход popa3d на свои файловые дескрипторы.

Все работает, за исключением одного но, никак не могу отследить момент завершения popa3d.

Запускаю фильтр:

bash-2.05b# ./test

+OK

USER VASIA

+OK

QUIT

+OK

test

Broken pipe

bash-2.05b#

После того, как popa3d получил QUIT, он ответил и вышел, попытка послать ему что-то еще приводит к Broken pipe.

А как определить из фильтра, что popa3d вышел?

Или я что-то делаю не так?

#include

#include

#include

#include

int main (void)

{

int in[2],out[2];

char child_prog[]="/usr/sbin/popa3d";

FILE *child_out,*child_in;

int pid;

char tmp[1024];

//Make pipes

if (pipe(in))

{

printf("%s","Can't make in pipe\n");

exit(-1);

}

if (pipe(out))

{

printf("%s","Can't make out pipe\n");

exit(-1);

}

//Fork

pid=fork();

if (pid<0)

{

printf("%s","Can't fork\n");

exit(-1);

}

else if (pid==0)

{ //child

close(out[0]);

close(in[1]);

dup2(in[0],STDIN_FILENO);

dup2(out[1],STDOUT_FILENO);

if (execlp(child_prog,child_prog,NULL)<0)

{

printf ("ERROR: Can't start %s: %s\n",child_prog, strerror(errno));

exit(-1);

}

exit(0);

}

//parent

close(in[0]);

close(out[1]);

if ((child_out=fdopen(in[1],"w"))==NULL)

{

printf("Can't fdopen out streem for child\n");

exit(-1);

}

if ((child_in=fdopen(out[0],"r"))==NULL)

{

printf("Can't fdopen input streem for child\n");

exit(-1);

}

//Talk cycle

while(fgets(tmp,1023,child_in)!=NULL)

{

printf("%s",tmp);

fflush(stdout);

//Get from stdin

if (fgets(tmp,1023,stdin)==NULL) {printf("fgets from stdin error\n");exit(0);}

// printf("get: %s\n",tmp);

//Write to child

if(fputs(tmp,child_out)==EOF) {printf("fput to child error\n");exit(0);}

if(fflush(child_out)==EOF) {printf("fflush child_out error\n");exit(0);}

}

}

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

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

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

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

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

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

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

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

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

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