[英]kill signal example
我正在嘗試以下示例: http://www.cs.cf.ac.uk/Dave/C/node24.html :
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sighup(); /* routines child will call upon sigtrap */
void sigint();
void sigquit();
main() {
int pid;
/* get child process */
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid == 0) { /* child */
printf("\nI am the new child!\n\n");
signal(SIGHUP,sighup); /* set function calls */
signal(SIGINT,sigint);
signal(SIGQUIT, sigquit);
printf("\nChild going to loop...\n\n");
for(;;); /* loop for ever */
}
else /* parent */
{ /* pid hold id of child */
printf("\nPARENT: sending SIGHUP\n\n");
kill(pid,SIGHUP);
sleep(3); /* pause for 3 secs */
printf("\nPARENT: sending SIGINT\n\n");
kill(pid,SIGINT);
sleep(3); /* pause for 3 secs */
printf("\nPARENT: sending SIGQUIT\n\n");
kill(pid,SIGQUIT);
sleep(3);
}
}
void sighup() {
signal(SIGHUP,sighup); /* reset signal */
printf("CHILD: I have received a SIGHUP\n");
}
void sigint() {
signal(SIGINT,sigint); /* reset signal */
printf("CHILD: I have received a SIGINT\n");
}
void sigquit() {
printf("My DADDY has Killed me!!!\n");
exit(0);
}
但是我沒有從子進程中看到任何 output 。
這是預期的行為嗎? 如果是這樣; 為什么?
非常感謝!
您的代碼有一個主要的競爭條件。 在父級發送signal
之前,您不能確保子級已完成調用信號。 您要么需要使用某種同步原語使父級等待子級安裝處理程序,要么需要在分叉之前安裝信號處理程序,以便子級繼承它們。
這是我所知道的同步這樣的進程
的最簡單
方法:
pipe(p)
創建一個 pipe。fork()
。close(p[1]);
(寫入結束) 和read(p[0], &dummy, 1);
close(p[0]);
並close(p[1]);
安裝信號處理程序后。read
返回時,您可以確定子級已設置其信號處理程序。 你也可以close(p[0]);
此時在父級中。編輯 2:也許是一種更好更簡單的方法:
sigprocmask
來阻塞所有信號並保存舊的信號掩碼。sigprocmask
以恢復原始信號掩碼。sigprocmask
以恢復原始信號掩碼。您應該使用 getpid() 而不是 pid()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.