簡體   English   中英

一次忽略SIGQUIT

[英]Ignore SIGQUIT once

我正在嘗試編寫一個函數來在進程上安裝信號處理程序,以在第一次調用SIGQUIT信號時忽略它,然后在第二個SIGQUIT信號上退出。 我打算將全局變量用於計數器,以計算SIGQUIT信號發送的次數。

但是我在執行此操作時遇到問題。 我發現SIG_IGN會忽略第一個SIGQUIT信號,但是我將如何檢測第一個信號以增加計數器(並可能更改signal()來調用信號處理程序)?

我的代碼如下:

// global var counter
int signal_counter = 0;

int main (int argc, const char * argv[]) {

    pid_t child_pid = 0;
    int child_status = 0;

    /* fork a child process... */
    child_pid = fork();

    if(child_pid < 0 ) { /* fork() and check if there were errors */
        perror("fork"); /* print a system-defined error message */
        exit(EXIT_FAILURE);
    }

    else if(child_pid == 0) { /* Child code */
        install_handler();
        for(; ;sleep(1)); /*loop forever*/
    }

    else { /* Parent code */
        printf("Parent processing starts\n");
        printf("\nPARENT: sending first SIGQUIT\n\n");  
        kill(child_pid,SIGQUIT);
        printf("\nPARENT: doing something\n\n");
        sleep(3);
        printf("\nPARENT: sending SIGQUIT again\n\n");  
        kill(child_pid,SIGQUIT);
    }

    return EXIT_SUCCESS;

}

void sigquit() {
    printf("SIGQUIT\n");
    sleep(2);
    exit(0);
}

void install_handler(){
    if (signal_counter == 0){
        signal(SIGQUIT, sigquit);
        signal_counter+=1;  
    }
    else{
        signal(SIGQUIT, sigquit);
    }
}

任何幫助,將不勝感激。

解決該問題的一種方法是使用posix標准。 根據它,安裝的信號是一個鏡頭。

信號第一次到達時,它將啟動指定的方法。 因此,如果另一個信號到達,則它將正常執行(即,它將退出您的應用程序進行sigquit)。

暫無
暫無

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

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