2

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

我想问几个问题,除了syslog. 我很高兴知道经验丰富的程序员是如何完成这些事情的。

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

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

  • 没有必要给free变量malloc分配空间吧?

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

4

2 回答 2

2

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

于 2013-06-06T18:37:08.310 回答
2

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

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

此外,当进程退出时,内核会自动关闭其所有打开的文件描述符,终止其所有线程,并释放其所有内存。如果你干净地退出,即通过返回main或调用,所有仍然打开的exitstdio都会自动刷新和关闭。FILE因此,您可能不必在退出时进行太多清理工作——最重要的是确保您完成了所有输出文件的生成并删除了所有临时文件。

您可能会发现仅崩溃软件的概念有助于确定哪些需要清理,哪些不需要清理。

于 2013-06-06T18:41:35.973 回答