【发布时间】:2020-11-20 16:15:21
【问题描述】:
我正在学习管道,我正在尝试使用普通管道进行通信。以下代码写入一次,但不会再次写入或读取。这有什么问题?
编辑:是的,我删除了 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;
}
【问题讨论】:
-
在
close(fd[WRITE_END]);之后,您希望如何写更多?与那里的管道的读数和关闭相同。 -
另外,还要对
write进行错误检查。 -
那么,如何在阅读时阻止写入?有cmets吗?
-
你真的不需要。如果管道填满,
write将阻塞,直到它可以通过管道发送数据。与read相同,如果没有可读取的内容,它将阻塞,直到有。 -
但是,管道没有填满。孩子总是读,而父母写。所以父母可以写一些字符,直到孩子阅读