发生致命错误时如何重启Linux系统(C编程)

我正在为embedded式Linux(debian-arm)设备编写一个C程序。 在某些情况下,例如,如果系统/程序发生致命错误,我希望程序通过system("reboot"); 在通过syslog()logging错误之后。 我的程序包括multithreadsUDP sockets ,几个fwrite()/fopen()malloc()调用,..

我想问几个问题,除了syslog之外,重新启动系统之前程序应该执行什么操作(如何)。 我希望知道这些事情是如何由有经验的程序员完成的。

你是否build议要执行其他任务?

系统会自动向所有进程发出SIGTERM信号,作为重新启动的一个步骤。 只要你正确的处理了SIGTERM ,在调用reboot命令后你不需要做任何特别的事情。 “正确处理SIGTERM ”的正常用法是:

  • 为自己创建一个管道。
  • SIGTERM的信号处理程序将一个字节(任何值将执行)写入该管道。
  • 您的主要select循环包含感兴趣的文件描述符集中管道的读取结束。 如果这条管道变得可读,就该退出了。

而且,当进程退出时,内核会自动关闭所有打开的文件描述符,终止其所有线程,并释放所有内存。 如果你退出干净 ,即从mainexit ,所有仍然打开的stdio FILE被自动刷新和关闭。 因此,您可能不必在出路上进行非常多的清理工作 – 最重要的是确保您完成生成任何输出文件并删除任何临时文件。

你可能会发现只有崩溃的软件的概念对于搞清楚什么是需要清理的东西很有用。

你需要做的唯一的清理是你的程序需要以一致的状态启动的任何东西。 例如,如果您在内部收集一些数据然后将其写入一个文件,您将需要确保在退出之前完成此操作。 除此之外,您不需要关闭套接字,关闭文件或释放所有内存。 操作系统旨在在流程退出时释放这些资源。