簡體   English   中英

在父進程出口處殺死子進程

[英]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.

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