嗨,我想在這裏做的是一個程序,首先註冊它的文件server.lock中的pid,然後它應該做一個fork()。兒子應該說它開始工作,而不是被動地等待並且發出信號SIGUSR2,並且當它收到它時,它應該終止它的執行並且寫下「再見殘酷的世界」。父母應該開始寫它並做一個被動等待,然後武裝信號SIGUSR1和SIGINT。如果它收到SIGUSR1,它自己應該發送信號SIGUSR2給子,如果它接收到信號SIGINT(如果它是第一次收到它),它應該說它獲得了信號,如果它是第二次它應該發送信號SIGUSR2到兒子就這樣終止了兒子的生命,這是執行。現在我的問題是與父母,我不知道爲什麼,但第二次它收到信號它說錯誤「用戶定義的信號2」,並離開,如果有人可以向我解釋我在做什麼錯在這裏,我會非常感謝。這是代碼。謝謝。使用fork()和信號處理程序c
int p = 1;
int son;
void handle_SIGINT(int signal){
if (p==1) {
p = 2;
printf("The authentication module received the signal SIGINT\n");
}else{
kill(son, SIGUSR2);
exit(0);
}
}
void handle_SIGUSR1(int signal){
kill(son, SIGUSR2);
}
void handle_SIGUSR2(int signal){
printf("Goodbye cruel world\n");
exit(0);
}
void main(){
int pid = getpid();
FILE *f = fopen("server.lock", "w");
fprintf(f, "%d", pid);
fclose(f);
int n = fork();
if (n==0) {
printf("The message handling module has started\n");
signal(SIGUSR2, handle_SIGUSR2);
while(1)
pause();
}else{
printf("The authentication module has started\n");
son = getpid();
signal(SIGUSR1, handle_SIGUSR1);
signal(SIGINT, handle_SIGINT);
while(1)
pause();
}
}
IIRC信號處理程序在調用時未被設置,這意味着它需要重新設置它自己。 – immibis
對不起,但不是所有3個信號處理程序都應該在主程序之前定義?我的意思是第一次(對於信號情報)父母完美地工作,問題是第二次。 – GamerGirl
可能重複的[sigaction和信號有什麼區別?](http://stackoverflow.com/questions/231912/what-is-the-difference-between-sigaction-and-signal) –