信号的相关知识


1、信号事件的发生的两个来源

①硬件来源(比如说是按下了键盘或者其他硬件故障)②软件来源

2、常用的发送信号的函数

kill函数,raise函数,alarm函数

3、常用的信号

SIGHUP:从终端上发出的结束信号

SIGINT:来自键盘的中断信号

SIGKILL:该信号结束接收信号的进程,杀死进程

SIGTERM:kill命令发出的信号

4、信号发送函数

Kill函数

函数的作用:传送信号给指定的进程

函数的原型:int kill(pid_t pid,int sig)

函数的参数:pidpid>0指定的进程pid

                pid=0 发送给目前进程相同进程组的所有进程

                pid=-1 广播给系统内所有的进程

                pid<0 传给进程组识别码为pid绝对值得所有进程

            sig:信号

函数的返回值:成功:0;出错:-1

头文件:#include<sys/types>

        #include<signal.h>

函数实现代码:

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <sys/types.h>

#include <sys/wait.h>

 

int main()

{

   pid_t  pid;

   int ret;

   

   if((pid=fork()) < 0)

   {

      perror("fork");

      exit(1);

   }

   

   if(pid == 0)

   {

    raise(SIGSTOP);

    exit(0);

   }

   else

   {

      printf("pid=%d\n", pid);

      if((waitpid(pid, NULL, WNOHANG)) == 0)

      {

           kill(pid,SIGKILL);

           printf("kill %d\n", pid);

      }

      else

      {

         perror("kill");

      }

         

       }

}

 

raise函数

函数的作用:发送信号给自身

函数的原型:int raise(int sig)

头文件:#include<signal.h>

函数实现代码:

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <signal.h>

 

int main()

{

   pid_t pid;

   int ret;

   

   if((pid= fork()) < 0)

   {

       printf("Fork error.\n");

       exit(-1);

   }

   if(pid == 0)

   {

       printf("child (pid:%d) is waiting for any signal\n.", getpid());

       raise(SIGSTOP);

       exit(0);

   }

   else

   {

    if((waitpid(pid, NULL, WNOHANG)) == 0)

    {

       kill(pid, SIGKILL);

       printf("parent kill child process %d\n", pid);

       

    }

    waitpid(pid, NULL, 0);

    exit(0);

   }

}

 

alarm函数

函数的作用:设置信号传送闹钟

函数的原型:unsigned int alarm(unsigned int seconds)

函数的返回值:返回之前闹钟的剩余秒数

函数实现队列:

#include<unistd.h>

#include<signal.h>

void handler()

{

    printf(“hello\n”);

}

int main()

{

int i;

signal(SIGALRM,handler);

alarm(5);

for(i = 0;i < 7;i++)

{

    printf(“sleep %d ...\n”,i);

    sleep(1);

}

}

pause函数

函数的作用:让进程暂停直到信号出现

函数的原型:int pause(void)

函数的返回值:-1

 

signal函数

函数的作用:设置信号处理方式

函数的原型:void (*signal(int signum,void (*hander)(int)))(int)

函数的返回值:成功:返回先前的信号处理函数指针;出错:-1

函数实现代码:

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

 

void my_func(int sign_no)

{

if(sign_no==SIGINT)

printf("I have get SIGINT\n");

else if(sign_no==SIGQUIT)

printf("I have get SIGQUIT\n");

}

 

 

int main()

{

printf("Waiting for signal SIGINT or SIGQUIT \n ");

/*注痢?á??处鋦理え?函ˉ数簓*/

signal(SIGINT, my_func);

signal(SIGQUIT, my_func);

pause();

exit(0);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值