我已经写了以下代码:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include <sys/types.h>
#include <sys/wait.h>
#define BUFF 200
int main(int argc, char *argv[]) {
char write_buffer[BUFF];
char read_buffer[BUFF];
strcpy(write_buffer, "This string supposed to be sent from parent to child");
int fds[2];
pid_t pid;
if ((pid=fork())==-1) {
perror("fork error");
}
if (pipe(fds)==-1) {
perror("pipe error");
}
else if (pid==0) { // child
int bytes;
if ((bytes=read(fds[0], read_buffer, BUFF))==-1) {
perror("read error");
}
else {
printf("read %d bytes from pipe\n", bytes);
}
}
else { // parent
if (write(fds[1], write_buffer, strlen(write_buffer))==-1) {
perror("write error");
}
printf("FLAG to check if write() went through\n"); // this will print!
wait(NULL);
}
}
上面的简单代码是尝试通过管道从父进程发送数据到子进程
问题是,执行因某种原因暂停......
子进程在read()系统调用中被阻塞(或者至少看起来是这样),父进程就坐在那里,等待它完成,但这种情况从未发生过。
这里有什么问题?显然,父进程有足够的时间将write_buffer
写入管道,因此子进程不会在空管道上调用read()。
答案 0 :(得分:3)
您fork
然后创建管道,这样每个流程都会转到自己的一组管道,而这些管道彼此之间并不相互通信。
只需切换代码并在pipe
之前致电fork
,您就应该好了。
此外,虽然它可能在这里不重要,但养成了循环阅读和写作的习惯。 read
&amp; write
无法保证在一次通话中获取或放置您请求的所有数据。同样,完成后关闭管道。关闭管道的写入端将向读者发出已到达文件结尾的信号。
while (read(fds[0], read_buffer, sizeof(read_buffer)) > 0)
{
//process bytes read
}