C 我不能使用管道';在循环中读取和写入一次后的s写入和读取函数

C 我不能使用管道';在循环中读取和写入一次后的s写入和读取函数,c,process,pipe,fork,C,Process,Pipe,Fork,我正在学习管道,我正在尝试用普通管道进行通信。下面的代码只写一次,但不会再写或读。这有什么问题 编辑:是的,我删除了close()部分,但它无法完全读取,因为写入尚未完成 例: 写信:你好 读:他 阅读:llo #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #define BUF

我正在学习管道,我正在尝试用普通管道进行通信。下面的代码只写一次,但不会再写或读。这有什么问题

编辑:是的,我删除了close()部分,但它无法完全读取,因为写入尚未完成

例: 写信:你好

读:他

阅读:llo

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

#define BUFFER_SIZE 25
#define READ_END    0
#define WRITE_END   1

int main(void)
{
char write_msg[BUFFER_SIZE] = "Game Started";
char read_msg[BUFFER_SIZE];

pid_t pid; 
int fd[2];    // an array of 2 integers fd[0] and fd[1]

if (pipe(fd) == -1) { fprintf(stderr,"Pipe failed"); return 1;}

pid = fork();

if (pid < 0) { fprintf(stderr, "Fork failed"); return 1; }
while(1){
    if (pid > 0) { 
        sprintf(write_msg,"Hello %d",rand());
        write(fd[WRITE_END], write_msg, strlen(write_msg)+1); 

    }
    else { /* child process */
        int status = read(fd[READ_END], read_msg, BUFFER_SIZE);
        if(status != -1)
        printf("child read1: %s\n                     *********************************\n",read_msg);
    }

}


return 0;
#包括
#包括
#包括
#包括
#包括
#定义缓冲区大小25
#定义读取结束0
#定义WRITE_END 1
内部主(空)
{
char write_msg[BUFFER_SIZE]=“游戏开始”;
字符读取消息[缓冲区大小];
pid_t pid;
int fd[2];//由两个整数fd[0]和fd[1]组成的数组
if(pipe(fd)=-1){fprintf(stderr,“pipe failed”);返回1;}
pid=fork();
if(pid<0){fprintf(stderr,“Fork failed”);返回1;}
而(1){
如果(pid>0){
sprintf(写消息“Hello%d”,rand());
写入(fd[write_END],write_msg,strlen(write_msg)+1);
}
else{/*子进程*/
int status=读取(fd[读取结束]、读取消息、缓冲区大小);
如果(状态!=-1)
printf(“子读取1:%s\n*********************************\n”,读取消息);
}
}
返回0;

}

思考管道的一种方法是思考你家里的实际管道。水(或其他液体)从一端流向另一端。如果你在管道的一端用水桶不断地注满水,那么在另一端,你就无法区分是哪一个水桶将当前流出的水输送出去

这与计算机管道基本相同:字节从一端流向另一端,没有任何特定类型的消息边界。如果需要边界,则需要自己添加边界。在某种程度上,您已经这样做了,因为您在发送的数据中包含了字符串null终止符

由于您有一个“消息结束字节”(字符串空终止符),确保收到完整消息的简单方法是在循环中逐字节读取,直到到达空终止符。一旦你有了终结者,你就可以显示消息,然后返回阅读下一条消息

在伪ish代码中,它可能如下所示:

char ch;
while (read(pipe_read_fd, &ch, 1) == 1)
{
    if (ch == '\0')
    {
        // End of message, print the buffer
    }
    else
    {
        // Append character to buffer
    }
}

完成
close(fd[write_END])后,您希望如何编写更多的代码?与读取和关闭管道相同。此外,还要始终对
写入进行错误检查。因此,如何在读取时阻止写入?有什么评论吗?你真的不必。如果管道已满,则
write
将阻塞,直到可以通过管道发送数据。和读取相同,若并没有可读取的内容,它将阻塞直到有。但管道不会填充。孩子总是边读边写。因此,家长可以写一些字符,直到孩子读