- 一、信号
- 信号是操作系统提供的一种进程/线程同步机制
- 常用信号

- 管理员信号:只能按照默认方式处理,不能够被忽略和捕获
- 信号处理方式
- 缺省:按照默认处理方式处理
- 忽略:不处理
- 捕获:以自定义方式处理
- signal:注册一个信号
- #include <signal.h>
- typedef void (*sighandler_t)(int);
- sighandler_t signal(int signum, sighandler_t handler);
- 功能:设置信号的处理方式(注册一个信号)
- 参数:
- signum:要处理的信号的编号;
- handler:
- SIGIGN:以忽略方式处理该信号(不处理)
- SIG_DFL:以缺省方式处理(系统默认方式)
- 函数的地址:以捕获方式处理(自定义)
- 返回值:失败:NULL;自定义方式:返回自定义的函数入口地址
- void (*sighandler_t)(int signum);
- sighandller_t:执行信号任务处理函数的入口
- 参数:signum:触发该任务函数的信号

- 注意:
- 若信号不被注册,则按照默认方式处理
- 信号只需注册一次即可;
- 每次信号的到来都会触发一次信号任务处理函数;
- 信号尽可能早注册
- 发送命令
- kill命令
- 函数kill()
- int kill(pid_t pid, int sig);
- 功能:给指定的进程发送一个信号
- 参数:pid:接收信号的进程PID;sig:信号的编号
- 返回值:成功:0;失败:-1
- 子进程结束时,会发送SIGCHLD信号给父进程(子进程空间异步回收:通过子进程发送的SIGCHLD信号实现)
- int raise(int sig),给自己所在的进程发送信号
- unsigned int alarm(unsigned int seconds)
- 功能:设置一个闹钟,当闹钟时间到达时,向自己所在的进程发送一个SIGALRM的信号
- 参数:seconds:设置的闹钟的定时时间
- 返回值:成功返回上次设定剩余的时间;上次未设定则返回0
- pause();
- 功能:让一个进程挂起(进入到睡眠状态)
- 注意:pause可以被一个信号唤醒;这个信号必须要被捕获
- 二、共享内存
- 进程间效率最高的通信方式
- 通信原理
- 内核创建共享内存区域
- 进程将共享内存映射到自己的地址空间
- 进程通过指针直接访问共享内存
- 核心特点
- 零拷贝:数据不需要在内核和用户空间之间复制
- 直接访问:进程可以直接读写内存区域
- 高速通信:比管道、消息队列等快一个数量级
- 需要同步:必须配合同步机制使用(信号量IPC)
- 操作流程
- 创建一个IPC key
- key_t ftok(const char *pathname, int proj_id)
- 功能:创建一个IPC key
- 参数:pathname:路径;proj_id:工程ID
- 返回值:成功:IPCkey;失败:-1
- 创建共享内存
- int shmget(key_t key, 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
- 消息队列
- 和管道相似,有同步效果
- 增加数据的优先级(优先级数越小,优先级越高)
- 信号量集:进程间通信