我正在做OStep的家庭作业(job),并做了以下练习:
编写一个程序,创建两个子系统,并使用 pipe()系统调用.
下面是我如何理解我需要做的:为了连接第一个子进程的标准输出,我应该在父进程中使用pipe(pipe_name)
创建管道,执行一个fork()
创建第一个子进程,然后使用dup2( pipe_name[1],STDOUT_FILENO);
更改标准输出流.之后,任何printf
语句都会将文本发送到管道.然后我回到父进程,执行另一个fork()
以创建第二个子进程,执行dup2( pipe_name[0],STDIN_FILENO);
以更改输入.
这是正确的吗?如果是这样的话,第二个子元素怎么能读到管子里的东西?我想做
char words;
read(pipe_name[0], words, 1000);
但我的输出只有0
,不是我之前打印的字符串.我的C语法有什么问题吗,或者它更基本(我只是在学习C,所以前者是一个明确的可能性).
以下是我的完整代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
int
main(int argc, char *argv[])
{ int pipe_name[2];
printf("hello world (pid:%d)\n", (int) getpid());
if(pipe(pipe_name)<0){ printf("mission failed! We'll gettem next time...\n");
} else {
int rc = fork();
if (rc < 0) {
// fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) {
// child (new process)
printf("hello, I am child (pid:%d)\n", (int) getpid());
dup2( pipe_name[1],STDOUT_FILENO);
printf("hello, I am child (pid:%d)\n", (int) getpid());
} else {
// parent goes down this path (original process)
wait(NULL);
int rc2 = fork();
if (rc2 < 0) {
// fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc2 == 0) {
dup2( pipe_name[1],STDIN_FILENO);
char words;
read(STDIN_FILENO, words, 1000);
printf("My sibling says:\n %d\n", words);
} else { wait(NULL);
// parent goes down this path (original process)
printf("hello, I am parent of %d (pid:%d)\n",
rc2, (int) getpid());
}
}
return 0;
}}
并且输出是
hello world (pid:30421)
hello, I am child (pid:30422)
My sibling says:
0
hello, I am parent of 30423 (pid:30421)