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);
}
printf
內sigstop()
永遠不會被執行,sigquit()
被printf("killing child");
之前調用。這是怎麼發生的?我怎樣才能得到正確的輸出?
'SIGQUIT'不能殺死一個進程。那將是'SIGKILL'。 – Olaf
在信號處理程序中調用'printf()'會調用未定義的行爲。只有信號處理程序才能安全地調用異步信號安全函數:*行爲未定義...如果信號處理函數調用本標準中定義的函數,而不是下表*中列出的函數之一。請參閱http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_03 –