【问题标题】:C - Flush file buffer on forced terminationC - 强制终止时刷新文件缓冲区
【发布时间】:2016-11-21 23:09:05
【问题描述】:

我使用 fwrite 将程序的日志写入文件。碰巧的是,如果我的程序收到 SIG_KILL 缓冲区将不会被刷新并且一些数据将会丢失。当程序被强制完成时,有什么方法可以强制刷新缓冲区?

如果没有解决方案,你们认为在缓冲区中有一行完整的信息之后使用 fflush() 是一个好主意吗?这样,在最坏的情况下,我只会丢失一行信息。

谢谢!

【问题讨论】:

  • 不要强制用户使用SIGKILL 来终止你的程序?如果程序被阻塞到无法以其他方式终止,这通常应该是最后的手段,这就是它无法被阻止或处理的原因。
  • 我不强迫它。但是想象一下有人记得使用 Ctrl+ALt+Del 并关闭进程,在这种情况下,我不能让用户丢失缓冲区中的所有信息......
  • 没有。如果用户决定不必要地SIGKILL 程序,那是用户自己的错。如果你让你的程序忽略所有其他信号,那是你的错
  • Ctrl+Alt+Del 是什么意思?要 SIGKILL 进程,请按 Ctrl-C。
  • Ctrl-C 是 SIGINT,不是 SIGKILL。

标签: c file signals


【解决方案1】:

如果您的进程得到一个真正的SIGKILL,那么您的进程将无能为力,因为它将立即被操作系统杀死。

the POSIX standard on signals:

...

当进程停止时,发送到的任何附加信号 在该过程继续之前,该过程不得交付, SIGKILL 除外,它总是终止接收进程

...

系统不允许对信号 SIGKILL 或 SIGSTOP 设置为 SIG_IGN。

...

系统不应允许进程捕获信号 SIGKILL 和 信号停止。

SIGKILL 抓不到,也不能忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2018-07-11
    相关资源
    最近更新 更多