信号 进程间通信

信号

信号:实现进程间的通知机制

  实现进程间的异步通信

     异步通信:接收方不知道什么时候发送方会发送收据。

  • 系统支持的信号

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对象

  1. 创建一个IPCkey:

key_t ftok(const char *pathname,int proj_id)

功能:创建一个IPCkey

参数:

pathname:路径

proj_id:工程ID

注意:两个进程在创建KEY时必须使用相同的参数

返回值:

成功:IPC key

失败:-1

  1. 创建共享内存:

int shmget(key_tkey,size_t size,int shmflg)

功能:创建一个共享内存

参数:

key: IPC key

size:共享内存的大小环

会被扩展成PAGE_SIZE的整数倍

shmflg:

IPC_CREAT|0664

返回值:

成功:共享内存的ID

失败:-1

  1. 建立共享内存段和用户空间的内存映射:

void *shmat(int shmid, const void *shmaddr, int shmflg)

功能:建立共享内存内存映射

参数:

shmid:共享内存id

shmaddr:映射的用户空间首地址

NULL:让操作系统分配

shmflg:

SHM_RDONLY:只读

!SHM_RDONLY:可读可写

返回值:

成功:映射的用户空间首地址

失败:(void*)-1|

  1. 向共享内存写入数据--》通过用户空间的首地址写
  2. 解除映射关系

int shmdt(const void*shmaddr)

功能:解除内存映射关系

参数:

shmaddr:要解除的用户空间首地址

返回值:

成功:0

失败:-1

  1. 删除共享内存

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

功能:操作共享内存

参数:

shmid:要操作的共享内存id

cmd:要执行的操作指令

IPC_RMID:删除操作

buf:设置的参数

返回值:

成功:0

失败:-1

  • 信号量集

实现进程间同步

  • 消息队列

和管道类似,有同步效果

增加数据的等级(优先级:优先级数据越小,优先级越高)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值