我在Linux中运行了一个长时间的计算,并且不时地保存部分结果。我想防止在保存部分结果的函数中出现中断:例如,如果用户按下CTRL-C,我希望函数结束,然后程序停止运行)。
例如,在下面的代码中,我希望每个“Saving...”后面都跟着一个“Done”。
#include <iostream>
void save_result(int i) {
disable_interruptions(); // WHAT SHOULD I PUT HERE?
std::cout << "Saving...";
/* open some files, edit them depending on i, etc. */
std::cout << "Done\n";
enable_interruptions(); // WHAT SHOULD I PUT HERE?
}
int main() {
while(true) {
int i = 1; /* some long computation */
save_result(i);
}
}
字符串
我尝试的是:
- 使用文件原子性的一些属性。不幸的是,我必须在各个地方更改许多文件,我不能同时做所有的更新。
- 复制文件,编辑副本,自动移回原始位置。文件太大了,而且会花太多时间。
2条答案
按热度按时间pes8fvy91#
理想的解决方案实际上是屏蔽掉信号,而不是捕获信号并重新提升它,这将导致内核将其排队。一旦你摘下面具,信号就会发出。下面是一个示例:
字符串
在多线程程序中,使用
pthread_sigmask
。当一个信号指向整个进程时(例如,终端生成的SIGINT
),它可以由一个没有屏蔽该信号的线程来处理。kcwpcxri2#
第512章谢谢你给我指明了方向我们可以使用信号处理器捕获停止程序的操作,并在完成更新后重新引发信号。代码:
字符串
其他链接: