gpt4 book ai didi

c - 发生 fatal error 时如何重新启动 Linux 系统(C 编程)

转载 作者:太空狗 更新时间:2023-10-29 11:45:45 28 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

您可能会发现 crash-only software 的概念有助于确定哪些需要清理,哪些不需要清理。

关于c - 发生 fatal error 时如何重新启动 Linux 系统(C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969459/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com