2017-02-09 31 views
0

我想寫一個C程序,其中父進程暫停子進程,並在幾秒鐘後繼續執行它。SIGSTOP不在c程序中工作

#include <stdio.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <unistd.h> 

void sigstop(); 
void sigcont(); 
void sigquit(); 

int main() 
{ 
    int pid; 
    if ((pid = fork()) < 0) { 
     perror("fork"); 
     exit(1); 
    } 
    if (pid == 0) 
    { /* child */ 
     signal(SIGSTOP,sigstop); 
     signal(SIGCONT,sigcont); 
     signal(SIGQUIT, sigquit); 
     for(;;); /* loop for ever */ 
    } 
    else { 
     printf("\nPARENT: sending SIGSTOP to suspend the process\n\n"); 
     kill(pid, SIGSTOP); 
     sleep(5); 
     printf("\nPARENT: sending SIGCONT to continue the suspended process\n\n"); 
     kill(pid, SIGCONT); 
     sleep(5); 
     printf("killing child"); 
     kill(pid,SIGQUIT); 
     sleep(5); 
    } 
} 

void sigstop() 
{ 
    printf("CHILD: I've been suspended\n"); 
} 

void sigcont() 
{ 
    printf("CHILD: I'm back\n"); 
} 

void sigquit() 
{ 
    printf("My DADDY has Killed me!!!\n"); 
    exit(0); 
} 

printfsigstop()永遠不會被執行,sigquit()printf("killing child");之前調用。這是怎麼發生的?我怎樣才能得到正確的輸出?

+0

'SIGQUIT'不能殺死一個進程。那將是'SIGKILL'。 – Olaf

+0

在信號處理程序中調用'printf()'會調用未定義的行爲。只有信號處理程序才能安全地調用異步信號安全函數:*行爲未定義...如果信號處理函數調用本標準中定義的函數,而不是下表*中列出的函數之一。請參閱http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_03 –

回答

3

如果read the signal(7) manual page你會看到

的信號SIGKILLSIGSTOP不能被捕獲,阻止或忽略。

你根本無法捕捉到該信號。


最後一位,約"Killing child"得到印刷錯誤的順序是很容易解決:添加一個換行符給你打印的字符串。

這是因爲輸出到stdout(這是printf寫入的內容)默認爲行緩衝。這意味着stdout的內部緩衝區是刷新(即實際寫入終端)換行。如果您沒有換行符,那麼在退出進程時(即退出子進程後),緩衝區將被刷新。