【问题标题】:Is SIGPIPE signal received when reader is killed forcefully(kill -9)?当读卡器被强行杀死(kill -9)时是否收到 SIGPIPE 信号?
【发布时间】:2022-01-10 05:14:59
【问题描述】:

我使用 C 和 python 程序创建了一个 fifo。 fifo 是在 C 程序中创建的,它执行读取操作,而写入是在 Python 中完成的。我的问题如下:

  1. 如果我的阅读器(C 程序)被强行杀死,我的编写器会继续向 fifo 写入。我该如何处理这个问题,以便在读者被杀死时作家退出?
  2. 当 reader 被杀时,writer 是否收到 SIGPIPE 信号?

【问题讨论】:

  • 为什么不写一个简单的示例程序来测试它来自己回答呢?
  • 一定会试一试的。
  • 之后您可以发布自己问题的答案 :-)
  • 你应该展示你的代码。如果读取器是唯一打开 FIFO 进行读取的进程,则在尝试写入时应立即使用 SIGPIPE 向写入器发出信号——注意缓冲 I/O,这可能会延迟实际调用 write() 系统调用的时间。如果作者忽略了 SIGPIPE,那么 write() 系统调用将返回一个错误条件。如果有多个进程打开 FIFO 进行读取,则 所有 读取器必须在写入器收到信号之前死亡。

标签: python c named-pipes fifo sigpipe


【解决方案1】:

当使用已失效的读取器写入管道时,写入器将收到 SIGPIPE 信号。默认情况下,这将终止该进程。如果忽略该信号,则写入将返回错误 EPIPE。不管读者是怎么死的,这种情况都会发生。

【讨论】:

    【解决方案2】:

    所以我在进一步测试中观察到以下内容:

    1. 当读取器进程被杀死时,写入器不会收到 SIGPIPE。
    2. 但是,当读取器被杀死时,对 fifo 文件的打开调用在写入器端被阻止。 因此,我目前通过在我的作者的公开电话中添加 O_NONBLOCK 标志解决了问题 1 的问题。添加后,如果 fifo 没有活动的读取器,则 open 调用将引发异常。 谢谢!

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多