【发布时间】:2016-10-06 22:28:54
【问题描述】:
我正在练习信号。在编译代码时,我收到了未声明的 SIGALRM 和未声明的 SIGSTP 错误消息。
main.c:46:16: error: ‘SIGALARM’ undeclared (第一次在这个函数中使用) 信号(SIGALARM, (void (*)(int))sig_alarm);
main.c:68:16: error: ‘SIGSTP’ undeclared (第一次在这个函数中使用) 信号(SIGSTP, (void (*)(int))int_handler);
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void sig_alarm(int sig){
kill(sig,SIGKILL);
}
void parent1(int sig){
kill(sig, SIGUSR1);
}
void parent2(int sig){
if(sig == 0){/*child is running*/
kill(sig, SIGUSR2);
}else if(sig > 0){/*parent is running*/
printf("Goodbye!");
exit(0);
}
}
void int_handler(int sig){}
void child1(int sig){
printf("Signal received!");
}
void child2(int sig){
printf("Child exiting...");
exit(0);
}
int main(){
pid_t pid;
if((pid = fork()) < 0){
perror("fork error");
}else if(pid > 0){/*parent*/
signal(SIGALARM, (void (*)(int))sig_alarm);
alarm(10);
signal(SIGTSTP, (void (*)(int))parent1);
while(1){
pause();
}
alarm(0);
signal(SIGALARM, (void (*)(int))sig_alarm);
alarm(10);
signal(SIGINT, (void (*)(int))parent2);
while(1){
pause();
}
alarm(0);
}else{/*child*/
signal(SIGINT, (void (*)(int))int_handler);
signal(SIGSTP, (void (*)(int))int_handler);
signal(SIGUSR1, (void (*)(int))child1);
while(1){
pause();
}
signal(SIGUSR2, (void (*)(int))child2);
while(1){
pause();
}
}
return 0;
}
【问题讨论】:
-
请参阅How to avoid using
printf()in a signal handler,了解有关您可以在信号处理程序中执行的操作的限制的详细信息。另请注意,您的消息应以换行符结尾。