簡體   English   中英

發生致命錯誤時如何重新引導Linux系統(C編程)

[英]how to reboot a Linux system when a fatal error occurs (C programming)

我正在為嵌入式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分配空間的變量,對嗎?

您是否建議執行其他任務?

您唯一需要做的清理工作就是程序以一致狀態啟動所需的所有操作。 例如,如果您在內部收集一些數據然后將其寫入文件,則需要確保在退出之前完成此操作。 除此之外,您不需要關閉套接字,關閉文件或釋放所有內存。 操作系統旨在在進程退出時釋放這些資源。

系統會自動將SIGTERM信號發布給所有進程,這是重新啟動的步驟之一。 只要您正確處理了SIGTERM ,就不需要在調用reboot命令之后執行任何特殊操作。 “正確處理SIGTERM ”的通常習慣用法是:

  • 為自己創建一個管道。
  • SIGTERM的信號處理程序將一個字節(任何值都可以)寫入該管道。
  • 您的主select循環將管道的讀取端包含在感興趣的文件描述符集中。 如果該管道變得可讀,那就該退出了。

此外,當進程退出時,內核會自動關閉其所有打開的文件描述符,終止其所有線程,並釋放其所有內存。 而且,如果您干凈地退出(即通過從main返回或調用exit ,則會自動刷新並關閉所有仍打開的stdio FILE 因此,您可能不必在清理過程中進行太多清理-最重要的事情是確保完成生成所有輸出文件並刪除所有臨時文件。

您可能會發現僅崩潰軟件的概念對於確定需要清除的內容很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM