>Пытаюсь написать фильтр к внешней программе (например popa3d).
>
> юзер <--> фильтр <--> popa3d
>
> все работают через стандартный вход/выход.
> Создаю пайпы на вход/выход, форкаю popa3d, dup'лю вход/выход popa3d на свои
>файловые дескрипторы.
> Все работает, за исключением одного но, никак не могу отследить момент
>завершения popa3d.
Рекомендую select с проверкой (среди прочего) out[0] на читаемость. Как только окажется, что он готов для чтения, читать. Если read вернет 0, значит трубу закрыли.
После этого, разумеется, wait.
> Запускаю фильтр:
> bash-2.05b# ./test
> +OK
> USER VASIA
> +OK
> QUIT
> +OK
> test
> Broken pipe
> bash-2.05b#
>
> После того, как popa3d получил QUIT, он ответил и вышел, попытка
>послать ему что-то еще приводит к Broken pipe.
>
> А как определить из фильтра, что popa3d вышел?
> Или я что-то делаю не так?
>
> #include <stdio.h>
> #include
> #include <string.h>
> #include <errno.h>
>
> 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);}
> }
>
> }