从SIGINT句柄调用精细的函数-什么时候可以?

时间:2018-08-21 08:23:19

标签: c linux sigint

我的功能非常强大,我希望允许用户停止它并将其发送到恢复过程(由MyTable.resizeColumnsToContents() 实现)。我想到了使用SIGINT句柄:

elaborate_function

void handle(){ FILE * devNull = fopen("/dev/null", "w"); elaborate_function(devNull); } void foo(){ signal(SIGINT, handle); ... } 执行以下操作:

  1. 文件操作
  2. elaborate_function() / printf
  3. 调用其他功能
  4. 系统调用(fprintf
  5. 重置

我知道在信号处理程序中使用tar, cp, mv...被认为是不安全的(as said here),但是据我所知,不安全仅意味着可能的不良输出,在这种情况下,这并不困扰我(我建议将printf作为/dev/null参数传递,以阻止输出,如建议的here一样。)

除了FILE* fout函数之外,我的打算还有其他问题吗?这是我能想到的最简单的非阻塞输入机制。

仅在Linux上运行,因此我不必担心可移植性

1 个答案:

答案 0 :(得分:1)

有许多不安全的函数,因为在内部,这些函数可以锁定某些内容(例如互斥锁),因此对您来说“最糟糕”的情况是,竞争条件导致死锁。您还可能遇到导致sigsev的竞争条件,以及您要避免的其他许多可怕的错误(因为难以调试竞争条件)。

正如您所说,只有here中列出的功能是安全的。

对于非阻塞机制输入: 您可以创建一个线程来合并输入文件。 您可以使用signal引发一个标志(例如“ must_read_input”),并在代码中看到标志被引发后立即调用“ elaborate_function”。 您可以修改“ elaborate_function”以仅使用信号安全功能。

有很多方法。