进程间通信(信号、消息队列、共享内存、信号量)

进程间通信

目录

进程间通信

1 信号

2 消息队列

3 共享内存

4 信号量


1 信号

1.1信号的概念

        信号(signal)是一种软件中断,是UNIX系统中最为古老的进程之间的通信机制。用于在一个或多个进程之间传递异步信号。它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据。

1.2信号的来源

信号的来源有很多种方式,按照产生条件的不同可以分为硬件方式软件方式两种。

硬件方式

        当用户在终端上按下某键或某种组合键时,将产生信号;硬件异常产生信号。这些事件通常由硬件检测到,并将其通知给Linux操作系统内核,然后内核生成相应的信号,并把信号发送给该事件发生时的正在运行的程序。

软件方式

        用户在终端下调用kill命令向进程发送任务信号;进程调用kill或sigqueue函数发送信号;当检测到某种软件条件已经具备时发出信号,如SIGALARM信号。

1.3系统定义的信号

        每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到。编号34以上的是实时信号,只讨论编号34以下的信号,不讨论实时信号。

使用命令kill -l可以查看系统定义的信号列表

1.4信号的产生发送

函数可以向一个进程主动地发出一个信号,我们可以通过两个函数kill和alarm来发送一个信号。

kill函数

        进程可以通过kill函数向包括它本身在内的其他进程发送一个信号,如果程序没有发送这个信号的权限,对kill函数的调用就将失败,而失败的常见原因是目标进程有另一个用户所拥有。超级用户root除外。

kill函数的原型:

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

参数说明:

pid:进程号

sig:信号

它的作用把信号sig发送给进程号为pid的进程,成功时返回0。
kill调用失败的原因有三种:
1.给定的信号错误(EINVAL)
2.发送权限不够(EPERM)
3.目标进程不存在(ESRCH)

alarm函数

        alarm函数给我们提供了一个闹钟的功能,进程可以调用alarm函数在经过预定时间后发送一个SIGALRM信号。

alarm函数的原型:

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

参数说明:

函数中seconds为设定的秒数,在经过seconds秒后发送一个SIGALRM信号,如果seconds为0,将取消所有一设置的闹钟请求。alarm函数的返回值时以前设置的闹钟时间的余留秒数,如果返回失败则返回-1。

1.5信号的处理

signal函数:

        程序可用使用signal函数来处理指定的信号,主要通过忽略和恢复其默认行为来工作。signal函数的原型如下:

#include <signal.h>  
void (*signal(int sig, void (*func)(int)))(int); 

        这是一个相当复杂的声明,耐心点看可以知道signal是一个带有sig和func两个参数的函数,func是一个类型为void (*)(int)的函数指针。该函数返回一个与func相同类型的指针,指向先前指定信号处理函数的函数指针。准备捕获的信号的参数由sig给出,接收到的指定信号后要调用的函数由参数func给出。其实这个函数的使用是相当简单的,通过下面的例子就可以知道。注意信号处理函数的原型必须为void func(int),或者是下面的特殊值:
    SIG_IGN:忽略信号
    SIG_DFL:恢复信号的默认行为
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值