父母和孩子之间的双向沟通​​管道(Two way pipe communication betwee

2019-10-19 12:00发布

我试图创建一个使用2管在C.the PROG1在child1运行我想以后从PROG1读取3 + 4 + 5送东西有写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);
}

prog2.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);
 }

Answer 1:

有与您的程序几个问题:

  1. 你是不是检查读取的返回值,写和prog2.c execle
  2. 要发送 “7 + 5 + 11 =吗?\ n” 字符串,它是10个字符长,但仅期望4个字符(3 + 4 + 5甚至不是4个字符)。
  3. 此外“关”正在发送为3个字符长,但不包括空终止。
  4. 当您从阅读fd ,你会在两种情况下没有得到空终止字符串,然后你想printf它。 这是一个快速的方法来未定义行为。 把一个“\ 0”缓冲区您从任何文件描述符读取结束后!
  5. 特别是什么read ,因为它会告诉你很多人物是如何看的回报是非常重要的。 你不应该忽略返回的值read (在某些情况下,它是用相同的write功能)。

下一次还提供了程序的一些输出,因为它会更容易给予一定的帮助。



Answer 2:

我没有按照建立管所有你的逻辑,所以我修改,希望澄清原件。 我要指出,不管是什么原因,我从命名来看外部程序(PROG1)点fd_in和fd_out(如fd_out就是PROG1被写入,fd_in就是PROG1正在读)。

这里是我的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;

}



文章来源: Two way pipe communication between parent and child