linux下C的 信号量 函数(sem开头的那一簇)的实践

linux下C的 信号量 函数(sem开头的那一簇)的实践


这是一种IPC(InterProcess Communication),进程间相互通信的技术。

信号量semaphore是一种操作系统管理的计数器,需要配合的多个进程,通过获取、创建、赋值、等待(消耗)同一个信号量,可以实现进程互斥、临界区保护、锁、生产者消费者模式等


主要的函数列表:

  • ftok:生成获取信号量的键值,以方便不同的进程获取到同一个信号量()
  • semget:获取、创建信号量
  • semctl:赋值、删除信号量
  • semop:等待 (消耗)信号量
  • semtimedop:带超时功能的等待(消耗)信号量

实际要解决的问题场景:

  • 进程A的过程funca循环执行;
  • 进程B的过程funcb循环执行;
  • 如果进程A和B都存在,funca必须要和funcb交替执行
  • 如果进程A和B不是同时存在, funca和 funcb 正常循环执行;
  • funca和 funcb 哪个首先执行不重要;
  • 进程A和B都可能随时启动、关闭或是重启

 

方案设计:

  1. 进程A 创建信号量sema,初始值为0, 进程B 创建信号量semb,初始值为1;
  2. funca在执行前试图获取 semb,如果没有获取到 semb ,表示 进程B不存在, 设置 sema 为0, funca正常执行;
  3. funca在执行前试图获取 semb, 如果获取到 semb ,表示 进程B已经存在, 等待 (消耗)信号量 semb 后( semb 为0 ),设置 sema 为0,执行funca,funca执行完毕后设置 sema 为1;
  4. funcb 在执行前试图获取 sema,如果没有获取到 sema ,表示 进程A不存在, funca正常执行;
  5. funcb 在执行前试图获取 sema, 如果获取到 sema ,表示 进程A已经存在, 等待 (消耗)信号量 sema 后( semb 为a ),设置 semb 为0,执行 funcb,funcb执行完毕后设置 semb 为1;

linux下C的 信号量 函数(sem开头的那一簇)的实践_第1张图片



你可能感兴趣的:(c,linux,Semaphore)