一.信号(续)
1.信号集合
在PCB中有两个重要的信号集,阻塞信号集和未决信号集,操作系统不允许用户直接对其进行位操作,需要自定义另外一个集合,借助信号集操作函数对其两个信号进行修改
sigset_t set,其中set就是申请的信号集,对这个集合进行操作的函数有:
#include <signal.h>
//将set集合置空
int sigemptyset(sigset_t *set);
//将所有信号加入set集合
int sigfillset(sigset_t *set);
//将signo信号加入到set集合
int sigaddset(sigset_t *set, int signo);
//从set集合中移除signo信号
int sigdelset(sigset_t *set,int signo);
//判断信号是否存在
int sigismember(const sigset_t *set, int signo);
2.信号阻塞集
每个进程都有阻塞集,创建子进程时子进程会继承父进程的阻塞集,其作用是暂缓信号的传送
#include <signal.h>
//检查和修改阻塞集
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);
how为阻塞集的修改方法,其3种情况:
- SIG_BLOCK:向信号阻塞集合中添加set信号集
- SIG_UNBLOCK:从信号阻塞集合中删除set信号集,
- SIG_SETMASK:将信号集set中的数据覆盖到阻塞集中
oldset为保存原先的信号阻塞集
#include <signal.h>
//读取当前进程的set未决信号集
int sigpending(sigset_t *set);
3.进程间通信方式
同一主机的进程通信:无名通道,有名通道,消息队列,mmap,共享内存,信号
不同主机的进程通信:socket(网络通信)
通信的特点:
- 无名管道:血缘关系、半双工、一对一、先进先出、无格式、数据读取后丢弃(内存中)
- 有名管道:无血缘、半双工、一对一、先进先出、无格式、数据读取后丢弃(内存抽象成文件名)
- 消息队列:多对多、按消息类型收取、同类型先进先出、有格式、数据读取后丢失(内存中)
- mmap:多对多、无格式、数据读取后存在、写入覆盖以前数据(磁盘中)
- 共享内存:多对多、无格式、数据读取后存在、写入覆盖以前数据(物理内存)
- 信号:简单、不能携带大量信息、满足某个特设条件才能发送
二.管道
1.文件描述符复制
让新的文件描述符指向旧的文件描述符,其函数为dup、dup2
dup函数:
#include <unistd.h>
//从系统中寻找最小可用的文件描述符,返回值为新文件描述符
int dup(int oldfd);