进程间的 信号 通信

首先注意:
这里是进程间的信号通信(signal),不是信号量通信(semaphore)

Linux系统支持的所有信号均定义在 /usr/include/asm/signal.h,其中常见的信号有:
- SIGKILL: 杀死进程
- SIGSTOP:暂停进程
- SIGCHLD:子进程停止或结束时用来通知父进程

发送信号

函数原形:
int kill(pid_t pid, int sig);

函数功能: 发送信号给进程或进程组。

所属头文件:

#include <sys/types.h>
#include <signal.h>

返回值:
若成功,返回0;若失败,返回-1.

参数说明:
pid
大于0:pid指向接收信号的进程
等于0:信号被发送给所调用进程所在的进程组的所有进程。
等于-1:信号被发送给允许本进程发送信号的所有进程。
小于-1:信号被发送给进程组的所有-pid进程。
sig:指明要发送的信号,若等于0,则无信号发送。

处理信号

函数原形:
//下面是一个函数指针,有一个int类型的参数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

函数功能: 设置信号的处理方式。

所属头文件:

#include <signal.h>

返回值:
若成功,返回前一个处理函数的指针;若失败,返回SIG_ERR。

参数说明:
signum:要处理的信号
handler:对应信号的处理方式,有如下三种取值:
SIG_IGN:忽略信号,不处理。
SIG_DFL:采用默认方式,交给内核处理。
用户自定义的函数:交给用户定义的函数来处理。

进程等待信号命令

函数原形:
int pause(void);

函数功能:
进程等待,直到信号的到来。

所属头文件:

#include <unistd.h>

返回值:
只有捕捉到信号,并且信号处理函数返回时,返回-1

例程:

1、发送信号的进程

/* AB两个进程实现信号通信,A进程的代码 */
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
/* A进程 向 B进程 发送 一个叫 SIGINT 的信号*/
void main(int argc, char *argv[])
{
        pid_t pid;
        pid = atoi(argv[1]);  //转化为整形
        kill(pid, SIGINT);    //发送SIGINT信号
}

2、接收信号的进程

/* AB两个进程实现信号通信,B进程的代码 */
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
/* A进程 向 B进程 发送 一个叫 SIGINT 的信号*/
void myfunc(int a)
{
    printf("Process B received the signal SIGINT.\n");
}

void main()
{
    signal(SIGINT, myfunc);//要处理SIGINT这个信号,用自定义的myfunc函数来处理
    pause();//  
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值