[英]Parent process to monitore and fork new child processes depending on exit status
[英]killing child processes at parent process exit
我對C和編程非常陌生,需要一些幫助。 在linux(cygwin)上的c中,我需要在退出時刪除所有子進程。 我看過其他類似的問題,但無法正常工作。 我試過了-
atexit(killzombies); //in parent process
void killzombies(void)
{
printf("works");
kill(0, SIGTERM);
printf("works");
if (waitpid(-1, SIGCHLD, WNOHANG) < 0)
printf("works");
}
由於某些原因,“作品”甚至都不會打印。 我按Ctrl + C退出。
我也嘗試過-
prctl(PR_SET_PDEATHSIG, SIGHUP); //in child process
signal(SIGHUP, killMe);
void killMe()
{
printf("works");
exit(1);
}
但是因為我使用的是cygwin,所以當我#include <sys/prctl.h>
,cygwin說它找不到文件或目錄,並且我不知道要為其安裝什么軟件包。 另外,如果我的prctl()
函數正常工作,那會殺死所有僵屍嗎?
我的程序是一個客戶端服務器,我的服務器forks()處理每個客戶端。 我想在服務器關閉時不留下任何僵屍。
您的waitpid
沒有提供通常的參數,我很驚訝它沒有崩潰。 原型是:
pid_t waitpid(pid_t pid, int *status, int options);
第二個參數應該是一個指向 int
的指針 ,您正在提供一個int
。 還要注意,您應該為每個孩子調用waitpid
,而您只為其中一個調用它。
僅當您正常退出時才調用atexit()
。 如果要通過CTRL + C退出,則需要從SIGINT的處理程序中調用函數。
從atexit(3)
的Linux文檔中:
如果進程由於傳遞信號而異常終止,則不會調用使用
atexit()
(和on_exit(3)
)注冊的函數。
如果您想在應用程序收到SIGINT或SIGTERM時進行清理,則需要安裝適當的信號處理程序並在其中進行工作。
您需要跟蹤您的進程有多少個子進程,然后多次調用wait。 而且,正如其他人所說,如果進程被信號終止,則不會調用atexit()函數,因此您還需要從信號處理程序中調用killzombies()。 您將需要以下內容:
int n_children = 0; // global
void handle_sig(int sig) {
killzombies();
exit(sig);
}
// your atexit()
void killzombies() {
kill(0, SIGKILL);
while (n_children > 0) {
if (wait(NULL) != -1) {
n_children--;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.