进程间通信方式(二)信号量

                                                                                                          信号量

一.基本概念的解释

1.信号量:同一时刻只有一个进程可以对临界区域的访问。俗话说相当于一个计数器(计数器记录着有几个进程可以使用),0代表阻塞,1代表执行。

2.临界资源:同一时间只能被一个进程所使用的资源。ey:打印机

临界区:进程访问临界资源的代码区域。

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

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

               

5.信号量的作用:进程间同步控制。(多进程访问临界资源时有顺序,一个执行,其余的处于等待状态,同样锁也是这样的,但是当使用锁时其它进程不能将其终端,但信号量可以)

二.有关信号量的函数

(1)semget(key_t  key,int  num_sems,int  sem_flags);//成功返回一个正数,它为信号量标识符,失败则返回-1(初始化或创建函数)

Key:信号量键,由此生成一个信号量标识符

num_sems:信号量数目,一般为1

Sem_flags:访问权限,一般为0664,如果没有信号则需要创建时要或上IPC_CREAT.

(2)int  semop(int  sem_id,struct  *sem_ops,size_t  num_sem_ops);

//用于改变信号量的值(P,V操作)

sem_id:信号量标识符

sem_ops:结构数组指针

结构为:struct  sembuf{

          short  sem_num;//信号编号,一般为0

          short  sem_op;//一般-1P操作,1V操作

          short  sem_flg;//通常为SEM_UNDO,用于跟踪信号量的修改情况,如果进程终止但没有释放该信号量,则操作系统会自动释放该信号量

              }

(3)int  semctl(int  sem_id,int  sem_num,int  command,...);//用来直接控制信号量信息(删除)

Sem_id:semget返回的信号量标识符

Sem_num:信号量编号,一般取0,表示第一个信号量

Command:将要采取的动作,有两种可能SETVAL将信号初始化为一个已知的值,一般为联合体的valIPC_RMID:用于删除一个已经无需继续使用的信号量标识符。

最后一个为union  semun结构:

Union  semun{

             Int  val;

             Struct  semid_ds  *buf;

             Unsigned  short  *array;

          }

总结完知识点后,自己为了更加理解信号量,则写了一个题,题为A进程发送OK,后B进程打印100以内的素数,自己所写代码如下
注:为了方便将信号量的创建,修改,删除用函数进行了封装。

sem.h:


sem.c


A进程


B进程


执行结果:


pa为A进程的可执行文件,pb为B进程的可执行文件




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值