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

int main() {

    pid_t c[2];
    int p[2];

    pipe(p);
    c[0] = fork();

    if (c[0] < 0) {
        fprintf(stderr, "fork error");
        exit(EXIT_FAILURE);
    } else if (c[0] == 0) {
        // First child

        close(p[1]); // unuse
        close(STDIN_FILENO);
        dup(p[0]);

        char buf[BUFSIZ];
        read(STDIN_FILENO, buf, BUFSIZ);
        printf("Second child's print: %s\n", buf); // First Child's print
    } else {
        c[1] = fork();

        if (c[1] < 0) {
            fprintf(stderr, "fork error");
            exit(EXIT_FAILURE);
        }
        else if (c[1] == 0) {
            // Second child

            close(p[0]); // unuse
            close(STDOUT_FILENO);
            dup(p[1]);
            printf("HI"); // Second child's print
        }
        else if (waitpid(c[0], NULL, 0) == -1 || waitpid(c[1], NULL, 0) == -1) {
            exit(EXIT_FAILURE);
        }
    }

    return 0;
}

我写了一段代码,第一个子元素通过read()函数从第一个子元素那里获得第二个子元素的write()函数的消息.

如果第一个子元素是在打印HI之前收获的,我是否有可能无法打印?

如果有可能,如何解决?

推荐答案

不是的.当第一个子进程调用read()时,它将阻止等待将某些内容写入管道.在第二个子 node 写入管道之前,它不会退出,因此写入不会失败.

如果将管道设置为非阻塞模式,就会出现您设想的could种情况.那么read()就不会等待写东西了,第一个子元素可以在第二个子元素try 写之前退出.如果发生这种情况,第二个子元素在呼叫write()时将收到SIGPIPE信号.

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

为什么下面的递归基本情况在C中不起作用?

C/SDL程序,渲染不使用我的渲染器

Malloc(sizeof(char[Length]))是否不正确?

在C++中头文件中声明外部 struct

如何将常量char*复制到char数组

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

从uint8_t*转换为char*可接受

添加函数会 destruct 嵌入式C代码(无IDE)

正数之和是负数

-Wnonnull-Compare警告不是具有误导性吗?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

如何在VSCode中创建和使用我自己的C库?

在git补丁中自动添加C的宏

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

gdb - 你能找到持有内部 glibc 锁的线程吗?

将指针的地址加载到寄存器内联拇指组件中

仅使用其内存地址取消引用 C 中的 struct

用于内存布局的size命令(文本、数据、bss)