LINUX信号发送

测试环境: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 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <errno.h>
 6 #include <signal.h>
 7 #include <sys/types.h>
 8 
 9 //铃铛的状态
10 #define  START 1
11 #define  break 0
12 
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  子进程发送信号,父进程接收信号结束挂起,在注册中查询是否注册该信号,如有存在则执行函数.

 

posted @ 2017-08-10 21:03  瓜子啊  阅读(335)  评论(0编辑  收藏  举报