1、信号通信
内核中存在64种信号,即linux 内核可以发送64种信号,命令“kill -l”可以查看
A - 信号的发送:kill、raise、alarm
kill(pid_t pid, int sig)
raise(int sig) 等价于 kill(getpid(), int sig) 即发给自己
附:终止进程 kill 9 进程号 或 raise(9) 终止自己 (9为SIGKILL信号)
alarm(int n) 定时 n 秒
B - 信号的接收:pause、sleep、while
C - 信号的处理:signal
处理哪个信号
以什么方式处理(SIG_IGN忽略,SIG_DFL默认,myfun自定义)
2、getpid() 获得进程 id 号
getppid()获得父进程 id 号
3、exit(0) 等价于 kill(getppid(), 17) 即,向父进程发送 17 信号(SIGCHLD)
4、wait(NULL) 可回收僵尸进程。本身为阻塞函数
代码:
1 #include <stdio.h> //standard input output
2 #include <sys/types.h> //pid_t pid; fork()
3 #include <signal.h> //signal
4 #include <stdlib.h> //exit(0) 否则会有warning警告
5
6 void myfun(int sig)
7 {
8 int i;
9 for(i = 0; i < 5; i++)
10 {
11 printf("sig = %d, i = %d\n",sig,i);
12 sleep(1);
13 }
14 return;
15 }
16
17 void myfun1(int sig)
18 {
19 printf("NOTE: exit() sig = %d\n",sig);
20 wait(NULL);
21 printf("NOTE: child process has been retrieved.\n");
22 return;
23 }
24
25 int main()
26 {
27 pid_t pid;
28 pid = fork();
29 if(pid > 0)
30 {
31 printf("parent pid = %d\n",getpid());
32 int i = 0;
33 signal(10, myfun);
34 //wait(NULL); 回收子进程的僵尸进程。但wait是阻塞函数。等待子进程结束时,后面的代码将无法执行
35 signal(17,myfun1);
36 while(1)
37 {
38 printf("parent process i = %d\n",i);
39 sleep(1);
40 i++;
41 }
42 }
43 if(pid == 0)
44 {
45 printf("child pid = %d, parent pid = %d\n", getpid(), getppid());
46 sleep(3);
47 kill(getppid(),10); //getppid()获取父进程id。10为SIGUSR1信号
48 sleep(3);
49 exit(0); //等价于 kill(getppid(),17)。17 为 SIGCHLD信号
50 }
51 return 0;
52 }
执行: