信号

信号是软件中断,是进程间唯一异步通信方式。信号来源分硬件和软件方式,硬件如按键、异常,软件如调用命令或函数。还介绍了多个信号相关函数,如signal、sigaction、kill等,说明了各函数功能、原型及使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号是一种软件终端,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式

信号来源

1、硬件方式

  1. 用户按下中断的某些键
  2. 硬件异常产生信号:除0操作、访问非法空间等

2、软件方式

  1. 用户在终端调用kill命令向进程发送任意信号
  2. 进程调用kill或sigqueue函数发送信号
  3. 检测到某种条件发生时
信号相关的几个函数
signal函数

1、 signal函数用来设置进程在接收到信号时的动作
2、 函数原型:

		 #include <signal.h>
         typedef void (*sighandler_t)(int);
         sighandler_t signal(int signum, sighandler_t handler);
         //signum信号
         //handler处置函数
sigaction函数

1、sigction函数可以用来检查和设置进程在接收信号时的动作。
2、函数原型

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
                    struct sigaction *oldact);
kill函数

1、 kill函数用来发送信号给指定进程
2、 函数原型

 #include <sys/types.h>
 #include <signal.h>
 int kill(pid_t pid, int sig);

该函数的行为与第二个参数pid的取值有关,第二个参数sig表示信号编号:

  • 如果pid时正数,则发送信号sig给进程号为pid的进程;如果pid为0,则发送信号sig给当前进程所属进程组里的所有进程;
  • 如果pid为-1,则把信号sig广播给系统内的除1号进程和自身以外的所有进程;
  • 如果pid为比-1还小的负数,则发送信号sig给属于进程组-pid的所有进程;
  • 如果参数sig是0,则kill(),仍然执行正常的错误检查,但不发送信号。可以利用这一点来确定某 进程是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill()返回-1,errno则被设置为ESRCH。
    注意:只有具有root权限的进程才能向其他任意一个进程发送信号,非root权限的进程只能向属于同一个组成或者同一个用户创建的进程发送信号。
raise函数

1、 raise函数时ANSI C而非POSIX标准定义的
2、 它被用来给调用它的进程发送信号
3、 函数原型:

       #include <signal.h>
       int raise(int sig);
sigqueue函数

1、 它支持信号带有参数,从而可以与函数sigaction配合使用。
2、 sigqueue用来发送信号sig给进程pid。
3、 函数原型:

         #include <signal.h>
         int sigqueue(pid_t pid, int sig, const union sigval value);

它和kill的不同点由:

  1. sigqueue支持信号携带参数
  2. sigqueue不能给一组进程发送信号
alarm函数

1、 alarm函数可以用来设置定时器,定时器超市将产生SIGALARM信号给调用进程。
2、 函数原型

     #include <unistd.h>
     unsigned int alarm(unsigned int seconds);	//设定的秒数,如果seconds为0,就不再发送SIGALARM信号。

最新一次调用alarm函数将取消之前一次的设定

abort函数

1、 abort函数用来向进程发送SIGABORT信号
2、 函数原型:

    #include <stdlib.h>
    void abort(void)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值