在这个例子中,同步如何工作?

时间:2015-11-26 05:30:12

标签: c linux linux-kernel operating-system system

我正在尝试将管道系统调用作为我学期项目的一部分。

我遇到了以下代码here

#include <sys/wait.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    int pfd[2];
    pid_t cpid;
    char buf;
    assert(argc == 2);

    if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }


    cpid = fork();
    if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }

    if (cpid == 0) {    /* Child reads from pipe */
        close(pfd[1]);          /* Close unused write end */

        while (read(pfd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);

        write(STDOUT_FILENO, "\n", 1);
        close(pfd[0]);
        _exit(EXIT_SUCCESS);

    } else {            /* Parent writes argv[1] to pipe */
        close(pfd[0]);          /* Close unused read end */
        write(pfd[1], argv[1], strlen(argv[1]));
        close(pfd[1]);          /* Reader will see EOF */
        wait(NULL);             /* Wait for child */
        exit(EXIT_SUCCESS);
    }
}

研究过多处理器编程后,我意识到这是一个生产者消费者模型。主要过程是分叉一个孩子,这个孩子正在消耗管道写入端主进程写入的字节。

我无法理解同步在这里是如何工作的。我的意思是父如何通知孩子它已在管道的写端写入n个字节?

关闭未使用的fd&s是否与同步有关?

如果在这个例子中,我希望孩子在写入端写一些东西而父母要读它呢?

任何帮助都会很棒,谢谢!

0 个答案:

没有答案