我的功能非常强大,我希望允许用户停止它并将其发送到恢复过程(由MyTable.resizeColumnsToContents()
实现)。我想到了使用SIGINT句柄:
elaborate_function
void handle(){
FILE * devNull = fopen("/dev/null", "w");
elaborate_function(devNull);
}
void foo(){
signal(SIGINT, handle);
...
}
执行以下操作:
elaborate_function()
/ printf
fprintf
)我知道在信号处理程序中使用tar, cp, mv...
被认为是不安全的(as said here),但是据我所知,不安全仅意味着可能的不良输出,在这种情况下,这并不困扰我(我建议将printf
作为/dev/null
参数传递,以阻止输出,如建议的here一样。)
除了FILE* fout
函数之外,我的打算还有其他问题吗?这是我能想到的最简单的非阻塞输入机制。
仅在Linux上运行,因此我不必担心可移植性
答案 0 :(得分:1)
有许多不安全的函数,因为在内部,这些函数可以锁定某些内容(例如互斥锁),因此对您来说“最糟糕”的情况是,竞争条件导致死锁。您还可能遇到导致sigsev的竞争条件,以及您要避免的其他许多可怕的错误(因为难以调试竞争条件)。
正如您所说,只有here中列出的功能是安全的。
对于非阻塞机制输入: 您可以创建一个线程来合并输入文件。 您可以使用signal引发一个标志(例如“ must_read_input”),并在代码中看到标志被引发后立即调用“ elaborate_function”。 您可以修改“ elaborate_function”以仅使用信号安全功能。
有很多方法。