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

时间:2013-06-06 18:26:49

标签: c linux error-handling debian reboot

我正在为嵌入式Linux(debian-arm)设备编写一个C程序。在某些情况下,例如如果系统/程序发生致命错误,我希望程序在通过system("reboot");记录错误后通过syslog()重启系统。我的计划包括multithreadsUDP sockets,多个fwrite()/fopen()malloc()来电,...

我想问一些问题,除了syslog之外,在重启系统之前程序应该执行哪些程序(如何)。我很高兴知道经验丰富的程序员如何完成这些工作。

  • 是否有必要在重新启动之前关闭打开的套接字(UDP)和线程?如果是这种情况,是否有一个函数/系统调用关闭所有打开的套接字和线程?如果需要关闭线程并且没有这样的全局函数/调用来结束它们,我想如何为每个特定线程执行pthread_exit(NULL);?我是否需要使用类似goto的内容来结束每个帖子?

  • 该程序应如何关闭fopenfwrite使用的文件?是否存在关闭正在使用的文件的全局调用,或者我是否需要手动查找正在使用的文件,然后对每个文件使用fclose?我看到在论坛fflush()flush()sync(),...上使用了一些示例,您建议使用哪一个?在一般情况下,如果使用所有这些功能会导致任何问题(虽然可以不必使用这些功能)吗?

  • 没有必要free malloc分配空间的变量,是吗?

您是否建议执行其他任务?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

系统会自动向所有进程发出SIGTERM信号,作为重新启动的步骤之一。只要您正确处理SIGTERM,就不需要在调用reboot命令后执行任何特殊操作。 “正确处理SIGTERM”的正常习语是:

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

此外,当进程退出时,内核会自动关闭其所有打开的文件描述符,终止其所有线程,并释放其所有内存。如果您干净地退出 ,即从main返回或致电exit,则所有仍处于打开状态的stdio FILE都会自动刷新并关闭。因此,您可能不必在出路时进行大量清理 - 最重要的是确保您完成生成任何输出文件并删除任何临时文件。

您可能会发现crash-only software的概念在确定清理什么和不需要清理方面很有用。

相关问题