Гость Опубликовано 13 мая, 2004 Жалоба Поделиться Опубликовано 13 мая, 2004 Пытаюсь написать фильтр к внешней программе (например 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);} } } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.