当父母过早地杀死孩子时,孩子会反转输出

时间:2011-05-10 11:06:58

标签: c unix exec fork signals

这是我正在努力实现的一些伪代码:

在子文件中,dup2输出描述符到文件然后执行不同的程序

在父母身上,在一段时间后杀死孩子

问题是虽然我杀了孩子之后输出文件是空的,即使孩子在某个阶段写了它。我究竟做错了什么?我不想等待孩子,但我也不希望它反转它已写入文件的内容。

1 个答案:

答案 0 :(得分:2)

如果您的孩子因信号而死亡,它将不会刷新任何缓冲区,这就是您没有看到任何输出的原因。有这个解决方案

  • 处理信号并冲洗缓冲区
  • 使用无缓冲的I / O(应该避免这种情况)
  • 同步孩子和父母(使用管道)(以便父母知道杀死孩子是安全的。)

当然,第三种选择是相当愚蠢的:发信号通知父母的孩子可以简单地退出。

修改 根据编辑过的问题和评论

stdio(printf,fwrite等),出于I / O效率的原因,使用了一些缓冲区。也就是说,当您执行简单的写操作时,低级操作不会立即发生。数据被复制到某个缓冲区,之后,当库认为有必要时(完整缓冲区或其他东西),缓冲区将被刷新 - 将写入内容。

现在,当程序调用{​​{1}}(正常进程终止)时,发生的事情就是刷新exit(3)个缓冲区。如果程序因信号而死亡,则不会刷新stdio个缓冲区,操作系统只会声明内存。

如果您无法控制程序stdio(比如说​​你是一个shell),你就不能确定如果你杀了他们就会做他们的事情。也就是说,这不是你的责任。但是,如果你控制它们(你说了一些关于管道的东西),你可以简单地通过管道发出一些序列,让孩子们调用exec