11-进程间通信-信号通信(功能:事件通知)

一、什么是信号

用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。

信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。

二、信号的种类

信号的名称是在头文件signal.h中定义的,信号都以SIG开头,常用的信号并不多,常用的信号如下(/usr/include/asm/signal.h):

这里写图片描述
更多的信号类型可查看附录表。

三、信号处理函数

  1. 信号发送函数kill():
    信号发送函数:kill
    原型:int kill(pid_t pid, int sig);
    头文件:《signal.h》《sys/types.h》
    功能:向指定的进程发送信号;
    返回值:成功:返回0;失败:返回-1;
    参数:pid:pid>0,向指定的进程号pid发送信号;另外两种情况看man 2 kill;

    sig:指定要发送的信号;

  2. 信号处理函数signal() :
    信号处理函数:signal
    原型:typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    头文件:《signal.h》
    功能:收到指定信号并进行处理;
    返回值:成功:返回函数指针;失败:返回SIG_ERR;
    参数:signum:指定要接收信号类型;

    handler:收到指定信号signum后的处理函数,有三种取值方式:1、SIG_IGN:忽略这个信号;2、SIG_DEF:默认交给内核处理;3、自己手写这个函数指针,自己处理;

四、示例:

设计两个程序A和B,A进程发送信号,B进程接受信号。
kill 函数:发送;
signal函数:接收。

#include <signal.h>
#include <unistd.h>

void myfun( int a ) {
        printf("receive chen:...\n") ;
}
void main(void) {
        signal( SIGINT , myfun ) ;
        pause() ;
}
/*使用kill命令发送SIGINT信号,例如:kill -n SIGINT pid(pid用命令:ps aux 查看上面程序的pid是多少。)*/
/*除了可以使用上面的命令kill发送信号外,还可以使用下面的程序发送信号。*/
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>

void main( int argc , char **argv ) {
        pid_t pid ;
        pid = atoi( argv[1] ) ;
        kill( pid, SIGINT) ;
}
/*假设可执行程序为send.则可执行程序send的参数为:./send pid(pid可由ps aux查看,获取第一个程序的pid) */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值