Двусторонняя связь между родительским и дочерним

Я пытаюсь создать двустороннюю связь между родительским и дочерним процессами, используя 2 канала в C. prog1, запущенном в child1. Я хочу читать 3 + 4 + 5 из prog1 после этого, чтобы отправить что-то в prog1 с записью, но я не смог. Где не так?

/* prog1.c */ #include  #include  #include  void main(void){ int FD; unsigned int buf; char buf[15]; printf("7+5+11=?\n"); FD=read(0,buf,10); if(FD<0){ perror("FAIL\n"); exit(EXIT_FAILURE); } printf("TAKED:%s\n",buf); } 

prog2.c

 #include  #include  #include  #include  #include  void ERR_SYS(const char *msg); int main(void){ char buf[15]; int pipe1[2]; int pipe2[2]; pid_t childpid; memset(buf,'\0',14); if(pipe(pipe1) < 0 || pipe(pipe2) < 0) ERR_SYS("fail_pipe"); if((childpid = fork()) < 0) ERR_SYS("fail_fork"); if(childpid==0) { dup2(pipe2[1],1); dup2(pipe1[0],0); close(pipe1[1]); close(pipe2[0]); close(pipe2[1]); close(pipe1[0]); //close(1); //close(0); execle("./prog1",NULL,NULL,NULL); }else{ close(pipe1[0]); close(pipe2[1]); read(pipe2[0],buf,4); /*I hope to read 3+4+5*/ printf("BuF::%s\n",buf); write(pipe1[1],"off",3);/*send {off}*/ wait(NULL); } return 0; } void ERR_SYS(const char *msg) { perror(msg); exit(EXIT_FAILURE); } 

В вашей программе мало проблем:

  1. Вы не проверяете возвращаемые значения read, write и execle в prog2.c
  2. Вы отправляете строку «7 + 5 + 11 =? \ N» длиной 10 символов, но ожидаете только 4 символа (3 + 4 + 5 – это даже не четыре символа).
  3. Также «выкл», который вы отправляете, имеет длину 3 символа, но без включения нулевого завершения.
  4. Когда вы читаете fd вы в обоих случаях не получите строку с нулевым завершением, а затем пытаетесь ее printf . Это быстрый способ неопределенного поведения. Поместите «\ 0» после окончания буфера, который вы читаете из любого дескриптора файла!
  5. Особенно то, что read возвращения очень важны, поскольку оно говорит вам, сколько символов было прочитано. Вы никогда не должны игнорировать возвращаемое значение read (в некоторых случаях это одинаково с функцией write ).

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

Я не следовал всей вашей логике в настройке труб, поэтому я изменил и, надеюсь, уточнил ваш оригинал. Я должен отметить, что по какой-то причине я назвал fd_in и fd_out с точки зрения внешней программы (prog1) (например, fd_out – это то, где prog1 пишет, fd_in – это где прог1 читает).

Вот содержание моего prog3.c:

 ... #define READ_END 0 #define WRITE_END 1 void ERR_SYS(const char *msg); int main(void) { char buff[15]; char *msg = "hello"; int fd_out[2]; int fd_in[2]; int nbytes; pid_t childpid; if(pipe(fd_out) < 0 || pipe(fd_in) < 0) { ERR_SYS("fail_pipe"); } if((childpid = fork()) < 0) { ERR_SYS("fail_fork"); } if(childpid==0) { //child //connect the write end of fd_out to stdout dup2(fd_out[WRITE_END], STDOUT_FILENO); close(fd_out[WRITE_END]); //connect the read end of fd_in to stdin dup2(fd_in[READ_END], STDIN_FILENO); close(fd_in[READ_END]); //the exec'd prog1 will inherit the streams execlp("./prog1", "prog1", NULL); //TODO: check return } else { //parent nbytes = write(fd_in[WRITE_END], msg, strlen(msg)); //TODO: handle any errors from write nbytes = read(fd_out[READ_END],buff,sizeof(buff)-1); //TODO: handle any errors from read buff[nbytes] = '\0'; printf("contents of buff::%s",buff); } return 0; } void ERR_SYS(const char *msg) { perror(msg); exit(EXIT_FAILURE); } 

И вот содержимое моего prog1.c

 int main(void){ char buff[15]; int nbytes; nbytes = read(STDIN_FILENO, buff, sizeof(buff)-1); buff[nbytes] = '\0'; printf("%s world\n", buff); return 0; 

}