Raspberry-Pi

子程序自殺但變成殭屍

  • September 23, 2019

我需要在我的 Raspberry Pi 上打開一個 GPIO 一段時間,所以我創建了一個函式來創建一個子程序,打開 GPIO 一段時間然後關閉。問題是,當我試圖讓子程序殺死自己時,它會像殭屍一樣呆在身邊。這個函式執行了很多,所以它不能保持這種狀態。有人對此有解決方案嗎?謝謝

void my_function(GPIOClass* gpio,useconds_t time) { pid_t pid=fork(); if(pid==0) { signal(SIGALRM,killchild) gpio->setval_gpio("1"); usleep(time*1000); gpio->setval_gpio("0"); alarm(3); while(1); } }

您將需要從父程序中獲取子程序。見wait(2)。似乎正在發生的事情是您只是在處理執行子程序程式碼的情況,而只是忽略了父程序中的結果。結果,父級在子級退出後不執行任何清理,並因此洩漏 PID。

最簡單的解決方案是將以下else情況添加到if條件中。

else if (pid > 0) {
   int status;
   waitpid(pid, &status, 0);
}

編輯:上述條件將阻止父程序,直到子程序完成。當孩子退出時,SIGCHLD信號被發送給父母,預設情況下它被忽略。但是,根據 POSIX.1-2001,如果您明確地將信號處理程序設置為SIGCHLDto SIG_IGN,那麼系統將自動清理子程序,但需要注意的是父程序將不知道子程序的退出狀態。

在您的初始化函式中,添加以下程式碼:

signal(SIGCHLD, SIG_IGN);

引用自:https://unix.stackexchange.com/questions/542904