测试环境: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.运行结果:
[email protected]:~/projects/proj$ ./main
ding ding ding ding !!!!
2.遇到的坑:
不小心写成父进程sleep,子进程发送信号先结束,之后父进程没有接收到任何信号。
忘记了fork() 执行之后,父子谁先结束是由内核决定的,
真正的步骤应该是:
2.1 子进程进行sleep
2.2 父进程调用pause()进程进行挂起
2.3 子进程发送信号,父进程接收信号结束挂起,在注册中查询是否注册该信号,如有存在则执行函数.
时间: 2024-10-12 20:10:54