主要用到的几个函数

0, ftok

ftok - convert a pathname and a project identifier to a System V IPC key

key_t ftok(char *pathname, char proj_id);

1, semget

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

函数作用:返回一个与参数 key 相关的信号量集。

信号量集被建立的情况有两种:

1.如果键key的值是IPC_PRIVATE (系统内核中没有与参数key相应的信号量存在)

2.或者键key的值不是IPC_PRIVATE,并且键所对应的信号量集不存在,同时标志semflg中指定IPC_CREAT。

2, semctl

 #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);

因为信号量一般是作为一个信号量集使用的,而不是一个单独的信号量。所以在信号量集的操作中,不但要知道IPC关键字值,也要知道信号量集中的具体的信号量。

系统调用semctl()的第一个参数是信号量集IPC标识符。第二个参数是操作信号在信号集中的编号

参数cmd中可以使用的命令如下:

·IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。

·IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。

·IPC_RMID将信号量集从内存中删除。

·GETALL用于读取信号量集中的所有信号量的值。

·GETNCNT返回正在等待资源的进程数目。

·GETPID返回最后一个执行semop操作的进程的PID。

·SETALL设置信号量集中的所有的信号量的值。

·GETZCNT返回正在等待完全空闲的资源的进程数目。



·GETVAL返回信号量集中的一个单个的信号量的值。

·SETVAL设置信号量集中的一个单独的信号量的值。

3, semop

 #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);

参数

semop参数1.semid:信号集的识别码,可通过semget获取。

semop参数3.nsops:信号操作结构的数量,恒大于或等于1。

semop参数2.sops:指向存储信号操作结构的数组指针,信号操作结构的原型如下

struct sembuf
{
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};

这三个字段的意义分别为:

sem_num:操作信号在信号集中的编号,第一个信号的编号是0。

sem_op:如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,如果没有设置IPC_NOWAIT,则调用该操作的进程或者线程将暂时睡眠,直到信号量的值为0;否则,进程或者线程不会睡眠,函数返回错误EAGAIN。

sem_flg:信号操作标志,可能的选择有两种

IPC_NOWAIT //对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。

SEM_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。

程序semp1.c

初始化时候资源数是1,每次while使用一个资源,没有资源时候就阻塞。

/*************************************************************************
> File Name: semp1.c
> Author: ims
> Created Time: 2018年09月19日 星期三 00时10分38秒
************************************************************************/ #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include<stdlib.h>
#include<stdio.h>
/*
struct sem{
unsigned short semval; // semaphore value
unsigned short semzcnt; // # waiting for zero
unsigned short semncnt; // # waiting for increase
pid_t sempid; // ID of process that did last op
}
*/
int main(void)
{
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
}arg;
arg.val = 1; // 初始化时候资源数是1
printf("The num of available resource is %d \n",arg.val);
key_t key;
if ((key = ftok(".",'c')) == -1)
{
perror("ftok error!\n");
exit(1);
}
printf("key:%d\n",key);
int semid;
if ((semid = semget(key,1,IPC_CREAT|0666)) == -1)
{
perror("semget error!\n");
exit(1);
} if (semctl(semid,0,SETVAL,arg) == -1)
{
perror("semctl error!\n");
exit(1);
}
/* Each operation is performed on the sem_num-th semaphore of the semaphore set,
* where the first semaphore of the set is numbered 0.
*/
struct sembuf sops;
sops.sem_num = 0; /* Operate on semaphore 0 */
sops.sem_op = -1; /* the absolute value of sem_op is subtracted from semval */
sops.sem_flg = 0; while (1)
{
if (semop(semid,&sops,1) == -1)
{
perror("semop error!\n");
exit(1);
}
printf("get a resource\n");
}
semctl(semid,0,IPC_RMID,0);//Immediately remove the semaphore set
exit(0);
}

程序semp2.c

每次运行都给semp1.c 程序资源加1,解除它的阻塞状态。

/*************************************************************************
> File Name: semp2.c
> Author: ims
> Created Time: 2018年09月19日 星期三 00时12分15秒
************************************************************************/ #include <sys/types.h>
#include<stdlib.h>
#include <sys/sem.h>
#include<stdio.h>
int main(void)
{
key_t key;
int semid; if (( key = ftok(".",'c')) == -1)
{
perror("ftok error!\n");
exit(1);
}
if ((semid = semget(key,1,IPC_CREAT|0666)) == -1)
{
perror("semget error!\n");
exit(1);
}
sembuf sops;
sops.sem_num=0;
sops.sem_op=1;
sops.sem_flg=IPC_NOWAIT; if(semop(semid, &sops, 1) != -1)
{
puts("relese a resource!");
} exit(0);
}

Linux Semaphore的更多相关文章

  1. Linux设备驱动之semaphore机制【转】

    转自:http://blog.csdn.net/xiao229404041/article/details/7031776 Linux设备驱动之semaphore机制在Linux系统中,信号号是一种重 ...

  2. linux内核剖析(十)进程间通信之-信号量semaphore

    信号量 什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明它被占用,测试的线 ...

  3. [内核同步]浅析Linux内核同步机制

    转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...

  4. Linux Kernel Synchronization && Mutual Exclusion、Linux Kernel Lock Mechanism Summarize

    目录 . 内核锁机制 . 同步与互斥 . 锁定内存总线原子操作 . 信号量 . 自旋锁 . RCU机制 . PERCPU变量 . 内存和优化屏障 . 读者/写者锁 . 大内核锁 . 互斥量 1. 内核 ...

  5. Linux内核同步机制

    http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...

  6. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  7. 编写linux驱动所用到的头文件(转)

    转自:http://blog.csdn.net/lufeiop02/article/details/6448497 关于linux驱动(应用)程序头文件使用 收藏 驱动程序: #include < ...

  8. 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/01/3052865.html 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我 ...

  9. 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

    这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...

随机推荐

  1. THE OVERARCHING PROCESS OF TEST DESIGN

    THE OVERARCHING PROCESS OF TEST DESIGN -Test note of “Essential Software Test Design” 2015-08-27 Con ...

  2. Mac下不显示设备

    使用命令行adb devices 试了下,没设备列表. 第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType     可以查看连接的usb设备的信息 ...

  3. Android 录音和播放

    今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来.所以了解了一些有关录音和播放的知识.接到这个任务的第一反应就是看看Andro ...

  4. 解决Django-1.8.2应用部署到Apache后无法显示admin应用的CSS

    在将Django-1.8.2应用部署到Apache后,无法显示admin应用的静态内容,而在“manage.py runserver”命令下可以正常显示,主要是Apache没有找到Django静态内容 ...

  5. ORA-00001: unique constraint (...) violated并不一定是数据冲突

    原文链接:http://blog.163.com/jet_it_life/blog/static/205097083201301410303931/ 收到一位测试人员RAISE的JIRA,说在某张表上 ...

  6. 使用Profile和Resources Filter隔离测试环境

    转自:http://juvenshun.iteye.com/blog/206825 Maven能够帮我们很好的管理测试,我们可以在 src/test/java 和 src/test/resources ...

  7. [Unity3D] 05 - Access to DB or AWS

    可以选择连接本地服务器,或者云服务器. 参考源代码 : https://www.cnblogs.com/wuzhang/p/wuzhang20141202.html (1) 功能:点击一下按键,然后访 ...

  8. 由n个元素组成的数组,n-2个数出现了偶数次,两个数出现了奇数次,且这两个数不相等,如何用O(1)的空间复杂度,找出这两个数

    思路分析: 方法一:涉及到两个数,就要用到异或定理了:若a^b=x,则a=b^x,b=x^a.对于这道题,假设这两个数分别为a.b,将数组中所有元素异或之后结果为x,因为a!=b,所以x=a^b,且x ...

  9. 中检测到有潜在危险的 Request.Form 值。

    两步 一.在</system.web>之前加上<httpRuntime requestValidationMode="2.0" /> <httpRun ...

  10. Pyramid Analytics宣布无缝集成BI Office和微软Power BI Desktop

    全球领先的企业商业智能(BI)软件提供商Pyramid Analytics与微软联手,凭借完善的分析平台BI Office强化Power BI Desktop的个人生产力功能.新的“Publish t ...