C 子进程如何从管道中读取stdout,而父进程如何将stdin写入管道?
那么,在这段代码中,子进程如何从管道中读取,父进程如何写入管道?fork()的结果是一个进程变为两个(通过无性繁殖)。因此,尽管在一个进程中仍然只执行if/else块的一个分支,但有两个进程,每个进程将执行一条路径 更具体地说,看看C 子进程如何从管道中读取stdout,而父进程如何将stdin写入管道?,c,linux,pipe,C,Linux,Pipe,那么,在这段代码中,子进程如何从管道中读取,父进程如何写入管道?fork()的结果是一个进程变为两个(通过无性繁殖)。因此,尽管在一个进程中仍然只执行if/else块的一个分支,但有两个进程,每个进程将执行一条路径 更具体地说,看看fork()返回的内容:一个PID到父级,一个0到新的子级。除此之外,这两个过程几乎是相同的。因此,if(cpid==0)检查是fork()之后的常见模式,因此您可以在每个进程中使用不同的逻辑。在您的例子中,这是在一个进程中读取,在另一个进程中写入。系统调用fork(
fork()
返回的内容:一个PID到父级,一个0到新的子级。除此之外,这两个过程几乎是相同的。因此,if(cpid==0)
检查是fork()
之后的常见模式,因此您可以在每个进程中使用不同的逻辑。在您的例子中,这是在一个进程中读取,在另一个进程中写入。系统调用fork()
返回两次。在父进程和子进程中。调用fork()
时,程序的两个精确副本正在运行。唯一的区别是fork()
的返回值
<> P>这样,当你孤立地考虑每个进程时,你的“如果只有一个”规则仍然有效。 < P>检查此资源以返回值的描述: 成功时,子进程的PID返回到 父级,子级中返回0。失败时,返回-1 在父进程中,不创建子进程,并且设置errno 适当地 因此,包含
cpid=fork()的行代码>在fork之后由两个进程执行,其中父进程接收新进程的PID,子进程接收0作为PID。因此,父母与子女之间存在着区别
// This code is pasted from
// http://linux.die.net/man/2/pipe
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */ <----- Point A
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */ <----- Point B
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}
if (...)
............; ---+
else |---> " Only ONE of them can be reached! "
............; ---+