信号
信号:实现进程间的通知机制
实现进程间的异步通信
异步通信:接收方不知道什么时候发送方会发送收据。
- 系统支持的信号
kill -l
10 )SIGUSR1
12)SIGUSR2
用户可自定义的信号
- 信号处理流程
signal:注册一个信号
#include <signal.h>
typedef void(*sighandler_t)(int);
长
sighandler_t signal(int signum,sighandler_t handler);
功能:设置信号的处理方式(注册一个信号)
参数:
signum:要处理的信号的编号
handler:
SIG_IGN:以忽略方式处理该信号
SIG_DFL:以缺省(默认)方式处理
函数的地址:以捕获方式处理()
返回值:
失败:NULL
自定义方式:返回自定义的函数入口
void (*sighandler_t)(int signum);
sighandler_t:执行信号任务处理函数的入口
参数:
signum:触发该任务函数的信号
注意:
1.若信号不被注册,则按默认方式处理;
2.信号只需注册一次即可;
3.每次信号的到来都会触发一次信号处理函数;
4.信号尽可能早注册
- 发送信号
1)kill 命令
2) kill()
int kill(pid_t pid, int sig);
功能:给指定的进程发送一个信号
参数:
pid:接收信号的进程PID
sig:信号的编号
返回值:
成功:0;
失败:-1
3)子进程结束时,会发送SIGCHLD信号给父进程
子进程空间异步回收:通过子进程发送的SIGCHLD信号实现
4)int raise(int sig);
给自己所在的进程发送信号
5)unsigned int alarm(unsigned int seconds);
功能:设置一个闹钟,当闹钟时间到达时,
向自己所在的进程发送一个SIGALRM的信号。
参数:
seconds:设置的闹钟的定时时间
返回值:
成功返回上次设定剩余的时间
上次未设定则返回0
6)pause();
功能:让一个进程挂起(进入到睡眠状态)
注意:
1.pause可以被一个信号唤醒
2.这个信号必须要被捕获
- 共享内存
共享内存:进程间效率做高的通信方式
1)通信原理
2)共享内存操作流程
IPC对象
- 创建一个IPCkey:
key_t ftok(const char *pathname,int proj_id)
功能:创建一个IPCkey
参数:
pathname:路径
proj_id:工程ID
注意:两个进程在创建KEY时必须使用相同的参数
返回值:
成功:IPC key
失败:-1
- 创建共享内存:
int shmget(key_tkey,size_t size,int shmflg)
功能:创建一个共享内存
参数:
key: IPC key
size:共享内存的大小环
会被扩展成PAGE_SIZE的整数倍
shmflg:
IPC_CREAT|0664
返回值:
成功:共享内存的ID
失败:-1
- 建立共享内存段和用户空间的内存映射:
void *shmat(int shmid, const void *shmaddr, int shmflg)
功能:建立共享内存内存映射
参数:
shmid:共享内存id
shmaddr:映射的用户空间首地址
NULL:让操作系统分配
shmflg:
SHM_RDONLY:只读
!SHM_RDONLY:可读可写
返回值:
成功:映射的用户空间首地址
失败:(void*)-1|
- 向共享内存写入数据--》通过用户空间的首地址写
- 解除映射关系
int shmdt(const void*shmaddr)
功能:解除内存映射关系
参数:
shmaddr:要解除的用户空间首地址
返回值:
成功:0
失败:-1
- 删除共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
功能:操作共享内存
参数:
shmid:要操作的共享内存id
cmd:要执行的操作指令
IPC_RMID:删除操作
buf:设置的参数
返回值:
成功:0
失败:-1
- 信号量集
实现进程间同步
- 消息队列
和管道类似,有同步效果
增加数据的等级(优先级:优先级数据越小,优先级越高)