【发布时间】:2012-09-29 01:31:59
【问题描述】:
下面的代码显示了子进程如何写入到管道端,然后父进程如何从另一端读取 . 我在试验代码后注意到的是,只有在子进程终止之后,父进程才能读取数据。
有没有办法在子进程调用 write() 之后强制父进程进入前台并立即读取数据?有没有办法在不终止孩子的情况下读取数据?
#include <stdio.h> /* For printf */
#include <string.h> /* For strlen */
#include <stdlib.h> /* For exit */
#define READ 0 /* Read end of pipe */
#define WRITE 1 /* Write end of pipe */
char *phrase = "This is a test phrase.";
main(){
int pid, fd[2], bytes;
char message[100];
if (pipe(fd) == -1) { /* Create a pipe */
perror("pipe");
exit(1);
}
if ((pid = fork()) == -1) { /* Fork a child */
perror("fork");
exit(1);
}
if (pid == 0) { /* Child, writer */
close(fd[READ]); /* Close unused end */
write(fd[WRITE], phrase, strlen(phrase)+1);
close(fd[WRITE]); /* Close used end */
}
else { /* Parent, reader */
close(fd[WRITE]); /* Close unused end */
bytes = read(fd[READ], message, sizeof(message));
printf("Read %d bytes: %s\n", bytes, message);
close(fd[READ]); /* Close used end */
}
}
【问题讨论】:
-
你想让父母等待孩子的终止吗?因为您观察到父级仅在子级终止后才读取可能不正确。我认为您观察到的是在该程序终止后您没有返回 shell 提示符。这可以通过确保父级简单地解决使用wait调用等待子进程的终止。但是如果要确保子进程终止,只有在确定父进程已读取数据时,也可以这样做。你能请吗?让我知道具体是什么要求。
-
@Tanmoy 我想要的是让父母在孩子终止之前读取数据。我还希望父母在孩子白人进入管道后立即读取数据。
-
我在回答中解释了一些概念。 PL。让我知道这是否有帮助。PL。再次考虑您的第二个要求。在多道程序环境中,您可能没有任何可移植的解决方案。