解释管道和叉子输出

Explain pipe and fork output

我是第一次在 Linux 中处理 pipe 和 fork,如果有人能向我解释以下程序的输出,我将很高兴:(哪一行代码导致输出并且是它通过子进程或父进程)

int main(){                              //1
    int ipc[2];                          //2
    pipe(ipc);                           //3
    write(2, "start\n", 6);              //4
    if (fork()) {                        //5
        sleep(1);                        //6
        char c;                          //7
        do {                             //8
            read(ipc[0], &c, 1);         //9
            write(1, &c, 1);             //10
        } while (c != '\n');             //11
        write(1, "if\n", 3);             //12
        waitpid(-1, NULL, 0);            //13
    }                                    //14
    else {                               //15
        write(ipc[1], "else1\n", 6);     //16
        write(1, "else2\n", 6);          //17
    }                                    //18
    write(1, "done\n", 5);               //19
    return 0;                            //20
}                                        //21

程序的输出是:

start
else2
done
else1
if
done

fork() 创建一个子进程,执行与原始进程相同的代码。如果成功,您的两个进程之间的唯一区别是:

  • 在原来的进程中,fork会return一个非零值(即子进程的id)
  • 在子进程中,fork将return一个零值

所以,换句话说:当你写:

if (fork()) {
    // Block "If"
} else {
    // Block "Else"
}

原进程执行“block if”,子进程执行“block else”。

pipe returns 两个文件描述符,一个可用于写入管道,另一个可用于从管道读取。所以当你写:

int ipc[2];
pipe(ipc);

你在ipc[1]里写的东西,你读ipc[0]的时候也能读出来。 换句话说,这是在 fork.

创建的两个进程之间进行通信的好方法

在您的示例中,子进程(在“else”中)在 ipc[1] 中写入数据,而原始进程(在“if”中)读取它。

您创建了一个在管道中写入数据的子进程,而您的原始进程从管道中读取数据。