我正在为embedded式Linux(debian-arm)设备编写一个C程序。 在某些情况下,例如,如果系统/程序发生致命错误,我希望程序通过system("reboot");
在通过syslog()
logging错误之后。 我的程序包括multithreads
, UDP sockets
,几个fwrite()/fopen()
, malloc()
调用,..
我想问几个问题,除了syslog
之外,重新启动系统之前程序应该执行什么操作(如何)。 我希望知道这些事情是如何由有经验的程序员完成的。
是否有必要在重新启动之前closures打开的套接字(UDP)和线程? 如果是这样,是否有一个函数/系统调用closures所有打开的套接字和线程? 如果线程需要closures,并没有这样的全局函数/调用来结束它们,我想如何执行pthread_exit(NULL);
为每个特定的线程? 我需要去使用像goto
结束每个线程?
程序如何closuresfopen
和fwrite
使用的文件? 是否有一个全局调用来closures正在使用的文件,或者我需要找出正在使用的文件,然后使用fclose
作为每个文件? 我看到在论坛上看到一些例子fflush()
, flush()
, sync()
,..,你会推荐使用哪一个? 在一般情况下,如果使用了所有这些function,它是否会引起任何问题(尽pipe这些function可能是不必要的)?
这是没有必要free
malloc
分配空间的variables,是吗?
你是否build议要执行其他任务?
系统会自动向所有进程发出SIGTERM
信号,作为重新启动的一个步骤。 只要你正确的处理了SIGTERM
,在调用reboot
命令后你不需要做任何特别的事情。 “正确处理SIGTERM
”的正常用法是:
SIGTERM
的信号处理程序将一个字节(任何值将执行)写入该管道。 select
循环包含感兴趣的文件描述符集中管道的读取结束。 如果这条管道变得可读,就该退出了。 而且,当进程退出时,内核会自动关闭所有打开的文件描述符,终止其所有线程,并释放所有内存。 如果你退出干净 ,即从main
或exit
,所有仍然打开的stdio FILE
被自动刷新和关闭。 因此,您可能不必在出路上进行非常多的清理工作 – 最重要的是确保您完成生成任何输出文件并删除任何临时文件。
你可能会发现只有崩溃的软件的概念对于搞清楚什么是需要清理的东西很有用。
你需要做的唯一的清理是你的程序需要以一致的状态启动的任何东西。 例如,如果您在内部收集一些数据然后将其写入一个文件,您将需要确保在退出之前完成此操作。 除此之外,您不需要关闭套接字,关闭文件或释放所有内存。 操作系统旨在在流程退出时释放这些资源。