信号量(通过进程通信实现进程间的同步)

信号量(semaphore)信号灯

信号量是共享内存整数数组.根据需要定义指定的数组长度

信号量就是根据数组中的值,决定阻塞还是解除阻塞

编程模型:

1.       创建或者得到信号量 semget

2.       初始化信号量中指定下标的值 semctl

3.       根据信号量阻塞或者解除阻塞 semop

4.       删除信号量 semctl

案例:

A:                                 B:

创建信号量                          得到信号量

初始化信号量                        解除阻塞

根据信号量阻塞

删除信号量

int semget(key_t key,

int nums,//信号量数组个数

int flags);//信号量的创建标记

//创建IPC_CREAT|IPC_EXCL|0666

//打开0

返回:  -1:失败

>=0:成功返回信号量的ID

int semctl(int semid,

intnums,//对IPC_RMID无意义

intcmd,//SETVAL(信号量值) IPC_RMID

...);//对IPC_RMID无意义

参数:   
semid:信号集的标识符,即是信号表的索引。
semnum:信号集的索引,用来存取信号集内的某个信号。
cmd:需要执行的命令,有效值有 需要使用联合体semun赋值

union  semun{

int  val;

struct semid_ds *buf;

unsigned short  *array;

struct seminfo   *_buf;

};//需要自己定义该联合体,根据需要定义,需要那个字段就可以只定义那个

int semop(

int semid,//信号量ID

struct sembuf*op,//对信号量的操作.操作可以是数组多个

size_tnums,//第二个参数的个数

);

返回:

-1:时失败

0:成功

struct  sembuf

{

int sem_num;//下标

int sem_op;

int sem_flg;//建议为0.

}

sem_op:
前提条件信号量是unsigned short int;
不能<0.
-:够减,则semop马上返回,不够减,则阻塞.
+:执行+操作
0:判定信号量>0,则阻塞,直到为0
               控制进程的搭配方式:
+(解除阻塞) -(阻塞)
0(阻塞)     -(解除阻塞)

代码:

semA:

#include<stdio.h>

#include<unistd.h>

#include<sys/ipc.h>

#include<sys/sem.h>

#include<stdlib.h>

#include<signal.h>

int  semid;

void  deal(int s)

{

//4.删除信号量

printf(“删除信号量…”);

semctl(semid,0,IPC_RMID , 0);

printf(“信号量已删除”);

exit( -1 );

}

union  semun{

int  val;

struct semid_ds *buf;

unsigned short  *array;

struct seminfo   *_buf;

};

void  main()

{

key_t key;

union semun  v; //2.2定义初始化值

int r;

//3.1定义一个操作结构体

struct sembuf op[1]; //定义了两个操作

signal(SIGINT , deal);

//1.创建信号量

key=ftok(“.” , 99);

if(key == -1) printf(“ftok err :%m\n”) ,exit(-1);

semid=semget(kay,1 /*信号量数组个数*/ , IPC_CREAT | IPC_EXCL | 0666);

if( semget == -1) printf(“get err %m\n”) ,exit(-1);

//2.初始化信号量

//2.1定义一个联合体

v.val=2;

r=semctl(semid , 0 , SETVAL , v); //设置信号量的值

if(r== -1) printf(“初始化失败:%m\n”) , exit(-1);

//3.对信号量阻塞操作

op[0].sem_num=0;  //信号量的下标

op[0].sem_op= 1;   //信号量操作单位与类型

op[0].sem_flg=0;    //操作标记  IPC_NOWAIT(信号量值够不够减都返回 不阻塞)

//SEM_UNDO    建议为0;

while(1)

{

r=semop(semid , op ,1);

printf(“信号量阻塞-1”);

}

}

//semop操作减一 ,信号量值大于0,semop执行返回,信号量值等于0时,semop操作阻塞等待,直到信号量值大于0,在进行该操作

semB:

#include<stdio.h>

#include<unistd.h>

#include<sys/ipc.h>

#include<sys/sem.h>

#include<stdlib.h>

union  semun{

int  val;

struct semid_ds *buf;

unsigned short  *array;

struct seminfo   *_buf;

};

void  main()

{

int semid;

key_t key;

int r;

//3.1定义一个操作结构体

struct sembuf op[1]; //定义了两个操作

signal(SIGINT , deal);

//1.得到信号量

key=ftok(“.” , 99);

if(key == -1) printf(“ftok err :%m\n”) ,exit(-1);

semid=semget(kay,1 /*信号量数组个数*/ ,0);

if( semget == -1) printf(“get err %m\n”) ,exit(-1);

//3.对信号量阻塞操作

op[0].sem_num=0;  //信号量的下标

op[0].sem_op= +1;   //信号量操作单位与类型

op[0].sem_flg=0;    //操作标记  IPC_NOWAIT(信号量值够不够减都返回 不阻塞)

//SEM_UNDO    建议为0;

while(1)

{

r=semop(semid , op ,1);

sleep(1);

}

}

//进程semA进行信号量阻塞-1  semB进行信号量接触阻塞+1 , semB进程控制semA进程的执行

Linux c 信号量的更多相关文章

  1. linux进程间通信-信号量(semaphore)

    一 为什么要使用信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问 代码的临界区域.临界区域是指执 ...

  2. Linux进程间通信--信号量

    信号量绝对不同于信号,一定要分清,关于信号,上一篇博客中已经说过,如有疑问,请移驾! 信号量 一.是什么   信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件 ...

  3. linux ipc信号量

    ipcs 命令,可以看到当前系统上的共享资源实例 ipcrm 命令,可以删除一个共享资源实例 linux 操作信号量的函数有三个:semget, semop, semctl semget 声明为: # ...

  4. Linux有名信号量的创建(sem_open中name参数构造)【转】

    转自:http://blog.csdn.net/gfeng168/article/details/40740865 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.sem_open函数nam ...

  5. Linux中信号量处理

    参考文章: http://blog.csdn.net/qinxiongxu/article/details/7830537/ 信号量一. 什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个 ...

  6. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

  7. linux Posix 信号量 一

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...

  8. linux 内核信号量

    Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干. 信号量在创建时需要设置一个 ...

  9. Linux进程间通信—信号量

    二.信号量(semophore) 信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制.实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作 ...

  10. linux下信号量可设值的函数操作

    #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <errno.h ...

随机推荐

  1. PHP 数组和对象的相互转化

    对象和数组的相互转化在开发中也是很常见,一般不是多维的情况下直接(array)和(object)就可搞定了,多维的话,遍历下也就可以了: 1 <?php 2 class test 3 { 4 p ...

  2. xml drawable

    1.Shape drawable:改变组件的形状和渐变xml shape标签 corner标签:改变轮廓 gradient:颜色填充的渐变 android:angle  android:angle=“ ...

  3. php-mysql 问题笔记一——在命令行中可以执行的sql语句,无法从php页面页面执行!

    我的情况: 1.由于外键较多,插入数据时,提前关闭外键(SET FOREIGN_KEY_CHECKS=0). 2.所使用的sql语句中,有外键绑定到其他表中,所以无法从php页面插入. 原因分析: S ...

  4. Noldbach problem

    Description Noldbach problem time limit per test: 2 seconds memory limit per test: 64 megabytes inpu ...

  5. lex 和 yacc 的区别与联系

    lex负责词法解析,而yacc负责语法解析,其实说白了就是lex负责根据指定的正则表达式,将输入的字符串匹配成一个一个的token,同时允许用户将当前匹配到的字符串进行处理,并且允许返回一个标识当前t ...

  6. xml 解析 Xstream

    1.概述 json 解析可以使用gson包解为现成的对象,那么xml可以不可以用现成的包解析成java的对象呢? 带着这个问题,查询了一些材料找到了Xstream解析方法,确实可以完成这种思考,只是实 ...

  7. QStringList不是简单重命名的便利类,而是提供了额外的函数,比如sort和join等等

    以前一直以为就是重命名而已,原来还不是.QT真伟大,方便到家了.该有的,全都有现成的.

  8. Delphi常见图象格式转换技术

    TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);//图片大小(全部,1/2,1/4,1/8)TBitmap.pixelFormat:=pf ...

  9. ListFragment和ListActivity的setOnItemClickListener不起作用

    在使用ListFragment时,发现一个奇怪的问题,就是getListView().setOnItemClickListener(new OnItemClickListener...)不起作用.在s ...

  10. Mysql中Key与Index的区别

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查 ...