测试环境:ubuntu 16.0
编译器: g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 (查看版本指令:g++ --version)
实验目的: 使用int kill(pid_t pid, int sig); 函数发送信号
实验步骤:子进程发送信号,父进程接收子进程发送的信号进行处理
以下为测试代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 //铃铛的状态10 #define START 111 #define break 012 13 //响铃状态14 static int ding_status = 0;15 16 void SignalFunc(int sig_num)17 {18 //对信号进行处理19 switch (sig_num)20 {21 case SIGALRM:22 ding_status = 1;23 break;24 }25 }26 27 int main(int argc, char* argv[])28 {29 pid_t pid;30 31 pid = fork();32 switch (pid)33 {34 case -1:35 perror("main()->fork!\n");36 break;37 38 case 0: //子进程向父进程发送消息39 sleep(2); //让父进程先执行等待40 41 int sendStaus = kill(getppid(), SIGALRM);42 if (-1 == sendStaus)43 {44 perror("subProcess send signal fail! \n");45 exit(1);46 }47 break;48 49 }50 51 //父进程注册处理信号52 signal(SIGALRM, SignalFunc);53 54 //阻塞点的作用55 //主要目的:挂起进程等待信号输入56 pause();57 58 if (START == ding_status)59 {60 printf("ding ding ding ding !!!!\n");61 }62 63 return 0;64 }
1.运行结果:
reacher@ubuntu:~/projects/proj$ ./main
ding ding ding ding !!!!
2.遇到的坑:
不小心写成父进程sleep,子进程发送信号先结束,之后父进程没有接收到任何信号。
忘记了fork() 执行之后,父子谁先结束是由内核决定的,
真正的步骤应该是:
2.1 子进程进行sleep
2.2 父进程调用pause()进程进行挂起
2.3 子进程发送信号,父进程接收信号结束挂起,在注册中查询是否注册该信号,如有存在则执行函数.