以下程序使用信号量控制程序运行

“信号”量

“变”量

/*信号量(semaphore)是变量,是一种特殊的变量。它仅取正值。

对信息号量的操作只有2种:等待(wait)和发送信号(signal)*/

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <unistd.h>

#include <errno.h>



#define IPCKEY 0x111

#define LOCKFILE "/home/liuyi/comm/1.lock" 

/*ftok的生成的key值依赖IPCKEY和LOCKFILE生成*/



/*arg for semctl systemcalls.*/ 

union semun {

  int val;/*value for SETVAL*/ 

  struct semid_ds *buf;/*buffer for IPC_STAT&IPC_SET*/

  unsigned short *arrary;/*array for GETALL&SETALL*/ 

};



/*结构体说明

struct sembuf

{

  unsigned short sem_num; 

  操作信号在信号集中的索引,第一个信号的索引是0

  short sem_op; 

  如果其值为正数,

  该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;

  如果sem_op的值为负数,会减去改信号内含的相应值,而其绝对值又大于信号的现值,

  操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;

  如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。

  short sem_flg; 

  信号操作标志,

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

  SEM_UNDO 程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。

  这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。

  (重要的地方)

}; */



int main()

{

    key_t   key;

    int     sem_id;

    union   semun options;

    struct  sembuf lock_it;/*sembuf见说明*/

    

    key = ftok(LOCKFILE,IPCKEY);

    printf("key=[0x%x]\n",key);

    

    sem_id = semget(key,1,IPC_CREAT|IPC_EXCL|0666);/*创建信号量集*/

    /*key,刚才ftok产生的,若指定IPC_PRIVATE,则由系统分配。*/

    /*1,信号量集中多少个信号量。*/

    /*IPC_CREAT如果信号量集在系统内核中不存在,则创建信号量集。

    IPC_EXCL当和 IPC_CREAT一同使用时,如果信号量集已经存在,则调用失败。*/

    /*0666,该信号权限为666*/

    

    /*ps:可以用ipcs –s命令来查看是否创建成功。ipcrm -s semid号来删除指定的信号量集。*/

    printf("创建信号量集ID为[%d]\n",sem_id);

    

    if(sem_id<0)

    {

      printf("信号量已经存在\n");

      sem_id = semget(key,1,IPC_CREAT|0666);/*已经存在信号量集,取得信号量集ID*/

      if(-1 == sem_id)

      {

          printf("取已存在的信号量集ID错误\n");

          exit(-1);

      }

      printf("已存在的信号量集ID为[%d]\n",sem_id);

    }

    else

    {

      options.val =1;/*设信号量集中的 那个信号量值为1*/

      semctl(sem_id,0,SETVAL,options);/*操作信号量集,SETVAL这里表示设置值*/

      /*sem_id:信号量ID,也就是semget函数的返回值*/

      /*0:要操作信号量在信号量集中的索引,从0开始*/

      /*SETVAL:操作类型,SETALL设置信号量集中的所有的信号量的值,

      SETVAL设置信号量集中的一个单独的信号量的值。等等*/

      /*options:要设定信号量集中的信号量值 的联合体,可选*/

    }

    

    printf("信号集ID sem_id=[%d] \n",sem_id);

    

    int i = semctl(sem_id,0,GETVAL);/*获取索引为0的位置的信号量的值*/

    printf("1索引为0的位置的信号量的值为[%d]\n",i);

    

    lock_it.sem_num =0; /*索引*/

    lock_it.sem_op = -1;/*设成-1,就是将信号量的值减去1*/

    lock_it.sem_flg = SEM_UNDO;/*程序结束后还原信号量的值*/

    

    semop(sem_id,&lock_it,1);/*操作信号量,使信号量的值减去abs(lock_it.sem_op)*/

    /*ps:如果当前信号量的值小于abs(lock_it.sem_op),会阻塞,直到当前信号量的值不

    小于abs(lock_it.sem_op)时候才会执行(靠外部程序改变当前信号量的值)*/

    

    i = semctl(sem_id,0,GETVAL);/*打印操作后的信号量值*/

    printf("2索引为0的位置的信号量的值为[%d]\n",i);

    

    /*这里开始就是你干的私活了*/

    int j;

    scanf("%d",&j);

    

    printf("finish\n");

    return 0;

}

收藏于 2012-08-09
来自于百度空间

linux信号量初识的更多相关文章

  1. Linux信号量详解

    1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. ...

  2. Java中处理Linux信号量

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5976361. ...

  3. Linux信号量同步共享内存实验.

    Linux信号量同步共享内存实验. Linux信号量同步共享内存实验. 简述 程序流程 信号量和共享内存的系统函数 信号量系统函数及接口 共享内存系统函数及接口 写程序 读程序 简述 本文主要内容是自 ...

  4. Linux入门——初识Linux

    Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...

  5. linux信号量之进程间同步

    概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...

  6. Linux 信号量同步编程

    前一篇文章概述了Linux 系统中信号量互斥编程,这篇文章正好是前一篇的姊妹篇----信号量同步.说它们是姊妹篇是因为它们都是利用了内核的信号量机制实现了进程间的通信.因为两者所解决的问题不同,因此它 ...

  7. Linux 信号量互斥编程

    所谓信号量,其实就是一个数字.内核给这个数字赋予一定的含义,让它等于不同的值时所表示的意义不同.这样就可以用它来标示某种资源是否正被使用.信号的分类其实挺多的,主要还是二值和计数器.这里讨论二值 现在 ...

  8. [转] linux 信号量之SIGNAL

    我们可以使用kill -l查看所有的信号量解释,但是没有看到SIGNAL 0的解释. [root@testdb~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) ...

  9. linux信号量与完成量

    信号量:    是用于保护临界区的一种常用方法,它的使用和自旋锁类似.与自旋锁相同,只有得到信号量的进程才能执行 临界区的代码.但是与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等 ...

随机推荐

  1. 0_Simple__simplePitchLinearTexture

    对比设备线性二维数组和 CUDA 二维数组在纹理引用中的效率 ▶ 源代码.分别绑定相同大小的设备线性二维数组和 CUDA 二维数组为纹理引用,做简单的平移操作,重复若干次计算带宽和访问速度. #inc ...

  2. 给Jquery easyui 的datagrid 每行增加操作链接(转)

    http://www.thinkphp.cn/code/207.html 通过formatter方法给Jquery easyui 的datagrid 每行增加操作链接我们都知道Jquery的EasyU ...

  3. 将 MyBatis3 的支持添加到 Spring

    http://www.mybatis.org/spring/zh/index.html What is MyBatis-Spring? MyBatis-Spring 会帮助你将 MyBatis 代码无 ...

  4. favicon.ico

    favicon.ico 作为网页的图标,被当前的所有浏览器都支持. 可直接放在主目录下,自动加载,也可设置在header中. <link rel="shortcut icon" ...

  5. SpringMvc Intercetor

    对于登录的访问控制以及session的超时控制. 当用户在未登录情况下,直接在地址栏输入url进入某些页面时,会越过登录页,如果不做控制会有安全问题. 因此可添加拦截器处理异常: /** * @Des ...

  6. 从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图

    从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:2063    更 ...

  7. 树莓派3用create_ap变身无线AP

    1.git clone https://github.com/oblique/create_ap.git2.cd create_ap3.sudo make install就这样安装好了4.接下来安装依 ...

  8. Null value was assigned to a property of primitive type setter of"原因及解决方法

    在action请求数据的过程中报出"Null value was assigned to a property of primitive type setter of"错误,搜索之 ...

  9. 判断一个对象是否为真 __nonzero__ 方法和 __len__方法

    class A(): def __nonzero__(self): # 判断 一个对象是否为空,先查看该方法的返回值 return 1 def __len__(self): # 如果没有上一个方法,那 ...

  10. Maven命令行使用 mvn clean package

    先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令:  mvn clean package 执行结果如下: [INFO] Scanning ...