如何解决执行父代码的子进程fork 之前的行 脚注
我很难理解 SIGTERM
的行为。我认为子进程将在docker stop <container>
“之后”执行行。所以我希望只看到一个“Hello world!”,但是这段代码:
fork()
输出两个“Hello World”。这是为什么?
我还从使用 fork()
的在线示例中注意到管道是在 fork 子节点之前创建的。父进程中创建管道后,子进程怎么也有管道?
解决方法
第一个问题很可能与您程序的文件缓冲模式有关,很可能使用完整缓冲设置,这意味着仅在缓冲区 (stdout
) 已满时才写入流,这会延迟输出,并且子进程也会输出,因为它有相同的stdout
。
如果您在 fflush(stdout)
之后立即使用 printf
,或者如果您将缓冲模式 (setvbuf
) 更改为行缓冲或根本不缓冲,您将防止重复输出,因为它会在 fork
之前发生。
对于第二个问题,子进程复制了父进程的代码,在fork
之后,正如你正确提到的,但它也复制了文件表。通过在 fork
之前创建未命名管道,您将确保子进程具有相同的文件描述符。这通常用于设置子进程和父进程之间的管道通信。
您可以检查这两个进程中的每一个的 /proc/<process id>/fd
文件夹以确认这一点。
脚注
为了将来参考,这是两个不同的主题,尽管相切,但它们属于不同的问题,您可以在此处查看其中一个问题,该问题与第一个问题的重复项很接近,但与第二个问题无关,尽管是偶然的它并没有没有得到答复,它仍然被埋在不同的事情中,其他用户几乎无法发现。
,当我们 fork 时,子进程得到父进程地址空间的精确副本。所以应该预料到这种行为。管道系统调用返回一个文件描述符,父进程和子进程都有这个描述符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。