C 子进程如何从管道中读取stdout,而父进程如何将stdin写入管道?

C 子进程如何从管道中读取stdout,而父进程如何将stdin写入管道?,c,linux,pipe,C,Linux,Pipe,那么,在这段代码中,子进程如何从管道中读取,父进程如何写入管道?fork()的结果是一个进程变为两个(通过无性繁殖)。因此,尽管在一个进程中仍然只执行if/else块的一个分支,但有两个进程,每个进程将执行一条路径 更具体地说,看看fork()返回的内容:一个PID到父级,一个0到新的子级。除此之外,这两个过程几乎是相同的。因此,if(cpid==0)检查是fork()之后的常见模式,因此您可以在每个进程中使用不同的逻辑。在您的例子中,这是在一个进程中读取,在另一个进程中写入。系统调用fork(

那么,在这段代码中,子进程如何从管道中读取,父进程如何写入管道?

fork()的结果是一个进程变为两个(通过无性繁殖)。因此,尽管在一个进程中仍然只执行if/else块的一个分支,但有两个进程,每个进程将执行一条路径

更具体地说,看看
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! "
  ............;   ---+