C 当父进程在读取时被阻止时,子进程被终止

C 当父进程在读取时被阻止时,子进程被终止,c,linux,embedded-linux,C,Linux,Embedded Linux,当父进程被管道中的read()阻塞时,子进程被终止时会发生什么情况?我应该如何在父流程中处理此场景 为了澄清,父进程有两个线程。假设thread1在thread2杀死孩子时正在从管道中读取数据 read()是否返回-1 非常感谢您的帮助。管道行为与流程关系无关。无论读者是作者的父母、子女、兄弟姐妹还是其他远亲,都适用相同的规则。或者即使读者和作者是同一个过程 简而言之,从读者的角度来看,写入进程的终止只是一个EOF,而不是一个错误,这并不取决于写入进程是自动调用\u exit(),还是被信号终止

当父进程被管道中的read()阻塞时,子进程被终止时会发生什么情况?我应该如何在父流程中处理此场景

为了澄清,父进程有两个线程。假设thread1在thread2杀死孩子时正在从管道中读取数据

read()是否返回-1


非常感谢您的帮助。

管道行为与流程关系无关。无论读者是作者的父母、子女、兄弟姐妹还是其他远亲,都适用相同的规则。或者即使读者和作者是同一个过程

简而言之,从读者的角度来看,写入进程的终止只是一个EOF,而不是一个错误,这并不取决于写入进程是自动调用
\u exit()
,还是被信号终止

整个因果链如下所示:

  • Process X模具->关闭所有Process X的文件描述符

  • 进程X的文件描述符之一是管道的写入端

  • 管道写入文件描述符已关闭->它是最后一个吗

  • 3a。同一管道上还有其他写文件描述符(例如,由fork继承,但在另一个进程中仍然打开),不会发生任何事情。停下来

    3b。此管道不再有写入文件描述符->管道已达到EOF

  • 管道点击EOF->读者注意
  • 4a。管道的所有读取文件描述符都将变为可读,唤醒在
    select
    poll
    read
    或其他类似系统调用上阻塞的任何进程

    4b。如果管道缓冲区中有任何剩余数据(在关闭最后一个写入文件描述符之前写入),则该数据将返回到读取器

    4c。重复4b,直到管道缓冲区为空

    4d。最后,
    read()
    返回0,表示EOF


    子进程的退出状态由系统调用的
    wait
    系列返回给父进程,您必须检查是否希望知道子进程何时被信号终止。

    管道行为与进程关系无关。无论读者是作者的父母、子女、兄弟姐妹还是其他远亲,都适用相同的规则。或者即使读者和作者是同一个过程

    简而言之,从读者的角度来看,写入进程的终止只是一个EOF,而不是一个错误,这并不取决于写入进程是自动调用
    \u exit()
    ,还是被信号终止

    整个因果链如下所示:

  • Process X模具->关闭所有Process X的文件描述符

  • 进程X的文件描述符之一是管道的写入端

  • 管道写入文件描述符已关闭->它是最后一个吗

  • 3a。同一管道上还有其他写文件描述符(例如,由fork继承,但在另一个进程中仍然打开),不会发生任何事情。停下来

    3b。此管道不再有写入文件描述符->管道已达到EOF

  • 管道点击EOF->读者注意
  • 4a。管道的所有读取文件描述符都将变为可读,唤醒在
    select
    poll
    read
    或其他类似系统调用上阻塞的任何进程

    4b。如果管道缓冲区中有任何剩余数据(在关闭最后一个写入文件描述符之前写入),则该数据将返回到读取器

    4c。重复4b,直到管道缓冲区为空

    4d。最后,
    read()
    返回0,表示EOF


    子进程的退出状态由
    wait
    系统调用系列返回给父进程,您必须检查是否希望知道子进程何时被信号终止。

    我建议共享您的代码以增加收到响应的机会。查看管道手册页:您至少应该努力测试您的场景。在这个过程中,你将了解它的行为,然后你可以问你看到的行为是否一致。每当一个孩子被杀时都会发生同样的事情。除非您忽略了它,否则父级将获得一个SIGCHLD,并且读取返回-1,errno设置为EINTR,除非缓慢的系统调用不可中断。如果子进程恰好是将写入端保存到管道的唯一进程,则read将在重试时返回0,如果不可中断,则会立即返回0。但是,如果您有一个编码错误,并且父级仍然有管道写入端的打开副本,并且忽略SIGCHLD,则父级将无限期地阻止。我建议共享您的代码以增加收到响应的机会。查看管道手册页:您至少应该努力测试您的场景。在这个过程中,你将了解它的行为,然后你可以问你看到的行为是否一致。每当一个孩子被杀时都会发生同样的事情。除非您忽略了它,否则父级将获得一个SIGCHLD,并且读取返回-1,errno设置为EINTR,除非缓慢的系统调用不可中断。如果子进程恰好是将写入端保存到管道的唯一进程,则read将在重试时返回0,如果不可中断,则会立即返回0。但是,如果您有一个编码错误,并且父级仍然有管道写入端的打开副本,并且忽略SIGCHLD,那么父级将无限期地阻塞。