我试图在c中使用2个管道在父进程和子进程之间创建双向通信。
我想从prog1读取3+4+5,然后用write向prog1发送一些内容,但我不能。
哪里错了?

/* prog1.c */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
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);
}

程序2.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
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);
 }

最佳答案

您的程序几乎没有问题:
您没有在prog2.c中检查read、write和execle的返回值
您发送的是“7+5+11=?\ n“字符串,长度为10个字符,但只需要4个字符(3+4+5甚至不是4个字符)。
另外,您发送的“off”是3个字符长,但不包括空终止。
当您从fd中读取时,在这两种情况下都不会得到以空结尾的字符串,然后您将尝试printf它。这是一个快速的方法,以不确定的行为。在从任何文件描述符读取的缓冲区结束后放置“\0”!
尤其是read返回的内容非常重要,因为它告诉您读取了多少字符。您不应该忽略read的返回值(在某些情况下,它与write函数相同)。
下一次也提供一些你的程序输出,因为它将更容易提供一些帮助。

10-08 05:40
查看更多