查看linux下有多少个信号:kill -l
具体信号的用法自己产看man手册这里就不详细描述了
这里主要我介绍几个函数:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler); //该函数的第二个参数是一个函数名(这里是一个有一个整形参数的函数指针)
该函数式用来注册信号(具体就是说,注册一个信号被那个函数来捕捉)
int kill(pid_t pid, int sig);//该函数的第一个参数是要向发送的pid(进程号),第二个参数是信号;
int raise(int sig);//其参数是要发送的信号,该喊有个用法就是该信号,没有指定对象,而是默认是当前进程来处理该信号
int pause(void); //是将进程挂起,知道接收到一个信号为止(是一个),如果想多个挂起可以用while将多个pause循环运用
unsigned int alarm(unsigned int seconds); //在secohnds秒后想当前进程发送SIGALRM信号
2、司机售票员问题
创建子进程代表售票员,父进程代表司机 ,同步过程如下:
售票员捕捉SIGINT(代表开车),发SIGUSR1给司机,司机打印(“let’s gogogo”)
售票员捕捉SIGQUIT(代表停车),发SIGUSR2给司机,司机打印(“stop the bus”)
司机捕捉SIGTSTP(代表车到总站),发SIGUSR1给售票员,售票员打印(“please get off
the bus”)
1 #include<signal.h>
2 #include<stdio.h>
3 #include<stdlib.h>
4 pid_t pid;
5
6 void sheller(int sgno) {
7 switch (sgno) {
8 case SIGINT: kill(getppid(),SIGUSR1);break;
9 case SIGQUIT:kill(getppid(),SIGUSR2);break;
10 case SIGUSR2:printf("get off the bus\n");break;
11 exit(0);
12 }
13 // exit(0);
14 }
15
16 void driver(int sgno) {
17 switch (sgno) {
18 case SIGUSR1: printf("let's go\n"); break;
19 case SIGUSR2:printf("stop the bus\n"); break;
20 case SIGTSTP:kill(pid,SIGUSR2); break;
21 wait(NULL);
22 exit(0) ;
23 }
7 }
28 int main(int argc,char *argv[]) {
29 if((pid = fork()) < 0) {
30 perror("creat fork error\n");
31 exit(-1);
32 }
33
34 if(pid == 0 ) {
35 signal(SIGTSTP,SIG_IGN);
36 signal(SIGINT,sheller);
37 signal(SIGQUIT,sheller);
38 signal(SIGUSR2,sheller);
39 while(1);
40
41 } else {
42
43 signal(SIGINT,SIG_IGN);
44 signal(SIGQUIT,SIG_IGN);
45 signal(SIGUSR1,driver);
46 signal(SIGTSTP,driver);
24,1 74%47 signal(SIGUSR2,driver);
48 while(1);
49 // exit(0);
50 }
51 return 0;