进程间通信——无名管道&信号量

一、无名管道

1、相对于有名管道而言,无名管道是在使用时产生的,不使用后就会被释放,因此不会在系统上留下任何痕迹。

2、无名管道在使用前没有任何的标示,所以无名管道只应用于父子进程之间。子进程会复制父进程的文件表数组(浅拷贝)。

3、无名管道的操作
创建/打开:int pipe(int fd(2));//fd[0]是读,fd[1]是写。
读:read(fd[0],buff,size);
写:write(fd[1],buff,len);
关闭:close(fd[1]);close(fd[0]);

关闭时需要将fd[0]和fd[1]都关闭掉,关闭顺序看自己心情,不存在先关闭哪一个会对另外一个造成影响。

注意:管道都是半双工通信,而无名管道创建后,父进程在fork产生子进程后,两个进程分别有一对读写,所以要在父子进程分别关闭读或写。

二、信号量(它是一个计数器,用于多进程对共享数据对象的访问)

1、临界资源:同一时刻,只可以被一个进程访问的资源。

2、临界区:访问临界资源代码区域。

3、原子操作:任何情况都不能被打断的操作。

4、内核对象:用于对进程间通信时,多进程能够访问同一资源的记录。

5、信号量的作用:进程间同步控制
信号量相当于记录资源能同时被多少个进程访问。

6、信号量的操作
(1)创建或获取:如果是创建,必须初始化;如果获取,则不能初始化。

int semget((key_t)key,int  nsems,int flag);//创建或者获取(返回值:若成功则返回信号量ID;失败返回-1)

key: 是整数值,不相关的进程可以通过它访问同一个信号量。程序对所有的访问都是间接的,它先提供一个键,再由系统生成一个相应的信号量标识符。只有semget函数才直接用信号量键,所有其他的信号量函数都是使用semget函数返回的信号量标识符。
nsems: 指定需要的信号量数目。
flag: 是一组标志,它低端的9个比特是该信号的权限,flag与IPC_CREAT做按位或操作,创建新的信号量;若存在,IPC_CREAT被忽略。

(2)加一操作:P操作
(3)减一操作:V操作

int semop(int semid,struct sembuf *buf,int lenth);//P   V操作(返回值:若成功则返回信号量ID;失败返回-1)

semid: semget函数返回的信号量标识符。
buf: 指向一个结构数组的指针。

(4)初始化和删除

int semctl(int semid,int nsems,int cmd,/*union semun un*/);

依赖于请求的命令,第四个参数是可选的,如果使用该参数,则其类型是semun,它是多个特定命令参数的联合(union)
semid: semget函数返回的信号量标识符。
nsems: 信号量编号,当用到成组的信号量时,需要用到这个参数,一般取值为0,表示这是第一个也是唯一的一个信号量。
cmd: 表示将要采取的动作,介绍两种常用的值。
(a)SETVAL: 用来把信号量初始化为一个已知的值,通过union semun中的val设置。其作用在信号量第一次使用之前对它进行设置。
(b)IPC_RMID: 用于删除一个已经无需继续使用的信号量标识符。

关于函数的实现,后期会专门更一篇博客。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值