linux高级学习6

一.信号(续)

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值