0
我按照以下意圖編寫了以下代碼: 子級向父級發送SIGKILL信號,然後父級會使用處理程序處理它。處理程序只是增加計數器。爲什麼SIGKILL不是由我的信號處理程序處理的,有時會導致帳戶註銷
int counter = 0;
void handler(int sig) {
counter++;
sleep(1); /* Do some work in the handler */
return;
}
int main() {
int i;
//signal(SIGUSR2, handler);
signal(SIGKILL, handler);
if (fork() == 0) { /* Child */
for (i = 0; i < 5; i++) {
//kill(getppid(), SIGUSR2);
kill(getppid(), SIGKILL);
printf("sent SIGKILL to parent %d\n", getppid());
}
exit(0);
}
wait(NULL);
printf("counter=%d\n", counter);
exit(0);
}
然而,第一種輸出我得到的是:
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
Killed
顯然,SIGKILL殺死父進程。爲什麼會發生這種情況,因爲我的處理程序不會殺死父母?
另一個非確定性但很高的概率事件(〜50%)是在我的ubuntu 14.04 64位機器上。如果我執行此代碼,我將自動從帳戶中註銷。爲什麼會發生?