ipcs 命令,可以看到当前系统上的共享资源实例

ipcrm 命令,可以删除一个共享资源实例

linux 操作信号量的函数有三个:semget, semop, semctl

semget 声明为:

#include #include#include

int semget(key_t key, int nsems, int semflg);

key 是一个键值,用来标识一个全局唯一的信号量集。要通过信号量通信的进程需要使用相同的键值来获取该信号量。

nsems 表示要创建/获取的信号量集中信号量的数目。如果是创建信号量,这个值必须指定。如果是获取已经存在的信号量,可以把它设置成0.

semflg 指定一组标志。它的低端9个比特是该信号量的权限。相当于文件操作权限,类似open函数的mode参数。而且,它还可以和IPC_CREAT标志按位“或”运算来创建新的信号量集。

成功返回一个正整数,它是信号量集的标识符;失败返回-1,并设置errno

semop 系统调用改变信号量的值,即执行P、V操作:

int semop(int semid, struct sembuf *sops, size_t nsops);

semid 是由 semget 返回的信号量集标识符,用来指定被操作的目标信号量集。

sops 是 struct sembug 结构体,定义为:

/*Structure used for argument to `semop' to describe operations.*/

structsembuf

{

unsignedshort int sem_num; /*semaphore number*/

short int sem_op; /*semaphore operation*/

short int sem_flg; /*operation flag*/};

sem_num 是信号量集的编号,0表示第一个信号量。

sem_op 指定操作类型,可选值为正整数、0、负整数。

sem_flg 可选值是 IPC_NOWAIT, SEM_UNDO。IPC_NOWAIT指,无论信号量集操作是否成功,semop调用都立刻返回。SEM_UNDO含义是,当进程退出时,取消正在进行的semop操作

nsops参数指定要执行的操作个数,即sops数组中元素的个数。semop对数组sops中的每个元素按照数组顺序依次执行操作,并且这个过程是原子操作。

semop成功返回0,失败返回-1并设置errno。失败的时候,sops数组中指定的所有操作都不执行。

semctl用来对信号量进行直接操作:

int semctl(int semid, int semnum, int cmd, ...);

semid 是semget调用返回的信号量集标识符。semnum指定被操作的信号量在信号量集中的编号。cmd指定要执行的命令。有的命令需要传入第4个参数,这个参数类型由用户定义,但是,内核给出了它的格式,而且,必须是这个格式:

union semun {int val; /*Value for SETVAL*/

struct semid_ds *buf; /*Buffer for IPC_STAT, IPC_SET*/unsignedshort *array; /*Array for GETALL, SETALL*/

struct seminfo *__buf; /*Buffer for IPC_INFO

(Linux-specific)*/};

cmd 的值比较多,不列举了,可以看manpage,其中,

IPC_STAT 将信号量集关联的内核数据结构复制到semun.buf中,

GETVAL 获取信号量的semval的值

SETVAL 将信号量的semval值设置为semun.val

IPC_RMID 立即移除信号量集,唤醒所有等待信号量集的进程

该函数返回值根据cmd不同而不同。失败返回-1,并设置errno

semget函数第一个参数key可以设置为 IPC_PRIVATE(值为0),这样,无论信号量是否存在,都会创建一个新的信号量

#include #include#include#include#include#include#include

//这个联合体需要手动定义

union semun

{int val; /*Value for SETVAL*/

struct semid_ds *buf; /*Buffer for IPC_STAT, IPC_SET*/unsignedshort *array; /*Array for GETALL, SETALL*/

struct seminfo *__buf; /*Buffer for IPC_INFO

(Linux-specific)*/};void ErrExit(const char*reason)

{

fprintf(stderr,"%s: %d, %s\n", reason, errno, strerror(errno));

exit(1);

}int initsem(int key = 0)

{int semid = -1;if (-1 == (semid = semget(key, 1, 0666 |IPC_CREAT)))

{

ErrExit("semget");

}//信号量初始值为1

union semun sem_un;

sem_un.val= 1;if (-1 == semctl(semid, 0, SETVAL, sem_un))

{

ErrExit("semctl");

}returnsemid;

}void destroysem(intsemid)

{if (-1 == semctl(semid, 0, IPC_RMID))

{

ErrExit("semctl del");

}

}//-1 为 p 操作

void P(intsemid)

{structsembuf op;

op.sem_num= 0;

op.sem_op= -1;

op.sem_flg=SEM_UNDO;if (-1 == semop(semid, &op, 1))

{

ErrExit("semop p");

}

}//1 为 v 操作

void V(intsemid)

{structsembuf op;

op.sem_num= 0;

op.sem_op= 1;

op.sem_flg=SEM_UNDO;if (-1 == semop(semid, &op, 1))

{

ErrExit("semop v");

}

}int main(int argc, char const *argv[])

{int semid =initsem();

pid_t pid=fork();if (pid > 0)

{

P(semid);

printf("in parent process...\n");

sleep(1);

V(semid);

waitpid(pid, NULL,0);//删除信号量集

destroysem(semid);

}else if (0 ==pid)

{

P(semid);

printf("in child process...\n");

sleep(1);

V(semid);

}else{

ErrExit("fork");

}return 0;

}

linux ipc 信号量,linux ipc信号量相关推荐

  1. Linux IPC进程间通信(三):信号量

    系列文章: Linux IPC进程间通信(一):管道 Linux IPC进程间通信(二):共享内存 Linux IPC进程间通信(三):信号量 Linux IPC进程间通信(四):消息队列 文章目录 ...

  2. Linux进程通信中IPC对象——IPC_PRIVATE与ftok

    在linux中,可以使用IPC对象来进行进程间通信.IPC对象存在于内核中,多进程可以操作同一个IPC对象.每个IPC对象都有一个唯一的编号,该编号是由系统分配的.那么不同的进程如何知道这个编号,进而 ...

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

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

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

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

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

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

  6. Linux信号量之内核信号量

    一.内核信号量 Linux内核的信号量在概念和原理上与用户态的System V的IPC机制信号量是一样的,但是它绝不可能在内核之外使用,它是一种睡眠锁. 如果有一个任务想要获得已经被占用的信号量时,信 ...

  7. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量

    <semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...

  8. 信号量 Linux函数 semget();semctl();semop();

    Linux进程通信之信号量 信号量(semaphore)是变量,是一种特殊的变量.它紧取正值.对信息号量的操作只有2中: 等待(wait)和发送信号(signal). 信号量比较难理解.下面我们一个个 ...

  9. Linux 3.进程间通信(IPC)(pipe 无名管道、mkfifo 有名管道、ftok、msgget、msgrcv、msgsnd、msgctl 消息队列)

    Linux 3.进程间通信(IPC) 进程间通信: 进程间方式: pipe 管道(无名管道) 头文件及原型 特点 pipe 示例 FIFO(有名管道) 管道文件的创建 mkfifo 头文件及原型 mk ...

  10. linux下清理信号量,Linux下进程间通信方式——信号量(Semaphore)

    1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据 ...

最新文章

  1. 8种最有可能在2016年倒闭的光伏企业
  2. python keyboard模块_python3 安装 pykeyboard 模拟浏览器
  3. GlusterFS架构与维护
  4. WeihanLi.Npoi 近期更新
  5. oracle数据库文件dbf复制#ocp试验#
  6. 服务器做raid bios界面做raid配置
  7. BetterScroll、移动端、滚动事件,如何使用
  8. 一文详解深度相机之TOF成像
  9. 如何落地用户画像分析?
  10. nfc修改饭卡软件下载_手机nfc模拟门禁卡app-NFC卡模拟软件中文版下载安卓标准版-西西软件下载...
  11. WordPress教程 – WordPress新手指南(2021)
  12. 工作之RF功能开发入门
  13. 编辑为什么建议转投_论文被退稿建议转投他刊是什么意思?
  14. IDEA加载文件:系统找不到指定文件
  15. 姜小白的Python日记Day9 变量与递归
  16. 星星之火-28:什么是CDMA的远近效应与功率控制?
  17. Python 斐波那契数
  18. 安全合规/GDPR--27--我们通过了GDPR合规认证
  19. VB.NET中LISTVIEW控件点击列首排序问题
  20. QQ名称花体英文(可复制)

热门文章

  1. MySQL 指定各分区路径
  2. Android -- Exif
  3. Python装饰器、metaclass、abc模块学习笔记
  4. HTML5模板生成工具
  5. J2EE项目架构最佳实践
  6. asp .net 多文件上传(二)
  7. 我的儿时理想—让世界没有乞丐
  8. 11. PHP 运算符
  9. css3中的perspective与perspective-origin
  10. Windows XP Embedded 官方下载地址