一、System V 信号量

1.信号量linux命令

显示:
ipcs -a  显示所有共享内核对象
ipcs -s  显示信号量   s = semphore删除:
ipcrm -s ID 删除信号量

二、主要函数应用

1. 函数原型:

#include <sys/sem.h>
int semget(key_t key, int nsems, int flag);

参数:

  • key:信号集的名字
  • nsems:信号集中信号量的个数
  • semflg:由九个权限标志构成,它们的用法和创建文件时用的mode模式标志是一样的。

2. 函数原型:

#include <sys/sem.h>
int semctl(int semid. int semnum, int cmd, ..../*union semun arg*/);

参数:

  • semid:由semget返回的信号集标识码
  • semnum:信号集中信号量的序号
  • cmd:将要采取的动作(有三个可能取值)
  • 最后一个参数根据命令不同而不同

cmd:

命令 说明
SETVAL 设置信号量集中信号量的计数值
GETVAL 获取信号集中的信号量的计数值
IPC_STAT 对此集合取semid_ds结构,并存储在arg.buf指向的结构中
IPC_SET 在进程有足够权限的前提下,把信号集中的当前关联值设置为semid_ds 数据结构中给出的值
IPC_RMID 删除信号集

3. 函数原型:

#include <sys/sem.h>
int semop(int semid, struct sembuf semoparray[], size_t nops);

参数:

  • semid:是该信号集量的标识码ID,也是semget函数的返回值。
  • sops:是一个指向结构体的指针
  • nsops:操作的信号量的个数

三、程序清单

#include <sys/sem.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>#define ERR_EXIT(m) do { perror(m), exit(EXIT_FAILURE); }while(0)
union semun
{int val;struct semid_ds *buf;unsigned short *array;
};int sem_creat(key_t key)
{int semid;semid = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);if (semid == -1)ERR_EXIT("semget");return semid;
}int sem_open(key_t key)
{int semid;semid = semget(key, 0, 0);if (semid == -1)ERR_EXIT("semget");return semid;
}int sem_setval(int semid, int val)
{union semun su;su.val = val;int ret;ret = semctl(semid, 0, SETVAL, su);if (ret == -1)ERR_EXIT("sem_setval");return 0;
}
int sem_getval(int semid)
{int ret;ret = semctl(semid, 0, GETVAL, 0);if (semid == -1)ERR_EXIT("sem_getval");printf("current val is %d\n", ret);return ret;
}int sem_d(int semid)
{int ret;ret = semctl(semid, 0, IPC_RMID, 0);if (ret == -1)ERR_EXIT("semctl");return 0;
}int sem_p(int semid)
{struct sembuf sb = { 0, -1, 0 };int ret;ret = semop(semid, &sb, 1);if (ret == -1)ERR_EXIT("semop"); return ret;
}int sem_v(int semid)
{struct sembuf sb = { 0, 1, 0 };int ret;ret = semop(semid, &sb, 1);if (ret == -1)ERR_EXIT("semop"); return ret;
}int sem_getmode(int semid)
{union semun su;struct semid_ds sem;su.buf = &sem;int ret = semctl(semid, 0, IPC_STAT, su);if (ret == -1)ERR_EXIT("semctl");printf("currcnt pcrmissions id %o\n", su.buf->sem_perm.mode);return ret;
}int sem_setmode(int semid, char *mode)
{union semun su;struct semid_ds sem;su.buf = &sem;int ret = semctl(semid, 0, IPC_STAT, su);if (ret == -1)ERR_EXIT("semctl");printf("cuttent permissions is %o\n", su.buf->sem_perm.mode);sscanf(mode, "%o", (unsigned int*)&su.buf->sem_perm.mode);ret = semctl(semid, 0, IPC_SET, su);if (ret == -1)ERR_EXIT("semctl");printf("permissins updated...\n");
}void usage(void)
{fprintf(stderr, "usage\n");fprintf(stderr, "semtool -c\n");fprintf(stderr, "semtool -d\n");fprintf(stderr, "semtool -p\n");fprintf(stderr, "semtool -v\n");fprintf(stderr, "semtool -s <val>\n");fprintf(stderr, "semtool -q\n");fprintf(stderr, "semtool -f\n");fprintf(stderr, "semtool -m <mode>\n");
}int main(int argc, char *argv[])
{int opt;opt = getopt(argc, argv, "cdpvs:gfm:");if (opt == '?')exit(EXIT_FAILURE);if (opt == -1){usage();exit(EXIT_FAILURE);}key_t key = ftok(".", 's');int semid;switch (opt){case'c':sem_creat(key);break;case'p':semid = sem_open(key);sem_p(semid);sem_getval(semid);break;case'v':semid = sem_open(key);sem_v(semid);sem_getval(semid);break;case'd':semid = sem_open(key);sem_d(semid);break;case's':semid = sem_open(key);sem_setval(semid, atoi(optarg));break;case'g':semid = sem_open(key);sem_getval(semid);break;case'f':semid = sem_open(key);sem_getmode(semid);break;case'm':semid = sem_open(key);sem_setmode(semid, argv[2]);break;}return 0;
}

四、参考资料

  • getopt函数用法

System V 信号量相关推荐

  1. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  2. linux 内核信号量与用户态信号量(system v,信号量在Linux多线程机制中的应用

    [摘 要]本文以信号量原理为基础,重点阐述信号量在Linux多线程同步机制中的实现特色. [关键词]信号量:Linux:多线程:同步 1 信号量 1965年E. W. Dijkstra首次提出信号量的 ...

  3. Linux进程间通信三 System V 信号量简介与示例

    1. System V信号量简介 SystemV信号量主要用于解决生产者和消费者问题,一个信号量能够控制多个资源,说它是信号量集也不为过. 2. API接口介绍 2.1 创建或打开信号量集 #incl ...

  4. 判断sem信号量为零_Linux系统编程——进程同步与互斥:System V 信号量

    信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...

  5. 【Linux系统编程】进程同步与互斥:System V 信号量

    信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 ...

  6. Linux IPC实践(11) --System V信号量(1)

    信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...

  7. System V信号量

    在上一篇笔记中,学习了Posix信号量.这篇笔记主要学习System V信号量,该信号量增加了信号量集的方式. 创建 #include <sys/types.h> #include < ...

  8. 【Linux】system V 消息队列 | system V 信号量(简单赘述)

    文章目录 1 . system V 消息队列(了解) 接口 查看消息队列 2.system V 信号量 (了解) 1.进程互斥等概念的理解 2.认识信号量 3. 接口 这两部分主要是了解即可,为后面学 ...

  9. linux进程间通信:system V 信号量和共享内存实现进程间同步

    关于信号量和共享内存的相关描述已经在前几篇提到过: 信号量:即内核维护的一个正整数,可以使用内核提供的p/v接口进行该正整数的+/-操作,它主要用来表示系统中可用资源的个数,协调各个进程有序访问资源, ...

最新文章

  1. Win32 环境下的堆栈
  2. java线程-保护性暂停(wait,notify实现)
  3. JAX-RS(Java API for RESTful Web Services)常用注解
  4. hadoop单机安装,小白上手最详细教程-Ali0th
  5. GetAsyncKeyState
  6. 成功解决Fatal error in launcher: Unable to create process using ‘“f:\program files\python\python36\pytho
  7. Visualization Document Feb 12 16:42
  8. Xilinx软硬IP双管齐下解决音视频处理痛点
  9. 苹果发布新手机,会有多少国人支持呢?
  10. 飞鸽传书10048错误的解决
  11. 重温数据结构——(1)
  12. 越狱后显示网络无法连接服务器,苹果手机:iOS12 越狱后 Cydia 无法联网闪退等问题汇总...
  13. 基于重心法哈特曼波前传感器光斑图像的质心计算
  14. 掌控你的信息流:在自己的VPS上部署RSSHub
  15. 编写SQL语句,从Orders表中检索顾客ID(cust_id)和订单号(order_num),并先按顾客ID对结果进行排序,再按订单日期倒序排列
  16. win2003企业版sp2序列号
  17. 智能客服“下半场“:数据、技术与服务
  18. 联想Y430P换屏记
  19. web 前端常见英文汇总
  20. 首页数据展示前端页面

热门文章

  1. java thread isalive_Java线程编程中isAlive()和join()的使用详解
  2. linux vim 执行shell命令行,Linux中vim和shell
  3. mysql数据库访问问题吗_#MySQL数据库无法远程访问的问题
  4. java内存模型按照线程隔离性_深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性...
  5. vs2019 缺android sdk,VS2019由于缺少NuGet Microsoft.NET.Sdk.Functions程序包而无法加载项目,但也无法添加此程序包(示例代码)...
  6. Kadane's algorithm学习
  7. stl中map函数_map :: empty()函数以及C ++ STL中的Example
  8. 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt
  9. 如何获取ubuntu源码包里面的源码进行编译
  10. h5 一镜到底_这些一镜到底的H5还能怎么玩?