信号

查看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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值