网站模板源码平台,成功的网络营销案例有哪些,帝国cms的手机网站,可编辑wordpress主题一、什么是信号量组 信号量组是信号量的一种#xff0c; 是system-V三种IPC对象之一#xff0c;是进程间通信的一种方式。
二、信号量组的特性 信号量组不是用来传输数据的#xff0c;而是作为“旗语”#xff0c;用来协调各进程或者线程工作的。信号量组可以一次性在其内…一、什么是信号量组 信号量组是信号量的一种 是system-V三种IPC对象之一是进程间通信的一种方式。
二、信号量组的特性 信号量组不是用来传输数据的而是作为“旗语”用来协调各进程或者线程工作的。信号量组可以一次性在其内部设置多个信号量而信号量本质上是一个数字用来表征一种资源的数量当多个进程或者线程争夺这些稀缺资源的时候信号量用来保证他们合理地秩序地使用这些资源而不会陷入逻辑谬误之中。
三、信号量组的使用场景 1、生产者-消费者模式 2、进程间同步 3、进程间通信
四、函数API接口 1、创建或者打开SEM对象 // 创建或打开SEM对象
int semget(key_t key, int nsems, int semflg);// 接口说明参数keySEM对象键值参数nsems信号量组内的信号量元素个数参数semflg创建选项IPC_CREAT如果该key对应的信号量不存在则创建IPC_EXCL如果该key对应的信号量已存在则报错mode信号量的访问权限创建信号量时还受到以下系统信息的影响
1、SEMMNI系统中信号量的总数最大值
2、SEMMSL每个信号量中信号量元素的个数最大值
3、SEMMNS系统中所有信号量中的信号量元素的总数最大值 2、P/V操作 对于信号量而言最重要的作用是用来表征对应资源的数量所谓的P/V操作就是对资源数量进行 n/-n 操作既然只是个加减法那么为什么不使用普通的整型数据呢原因是 1、整型数据的加减操作不具有原子性即操作可能被中断 2、普通加减法无法提供阻塞特性而申请资源不可得时应该进入阻塞 // PV操作
int semop(int semid, struct sembuf *sops, size_t nsops);// 接口说明参数semidSEM对象ID参数sopsPV操作结构体sembuf数组参数nsopsPV操作结构体数组元素个数返回值成功 0失败 -1PV操作结构体定义如下
struct sembuf
{unsigned short sem_num; // 信号量元素序号数组下标short sem_op; // 操作参数short sem_flg; // 操作选项
}根据sem_op的数值信号量操作分成3种情况1当sem_op大于0时当进行V操作释放即信号量元素的值semval将会被加上sem_op的值。如果SEM_UNDO被设置了那么该V操作将会被系统记录V操作永远不会导致进程阻塞。2当sem_op等于0时进行等零操作如果此时semval恰好为零则semop()立即成功返回否则如果IPC_NOWAIT被设置则立即出错返回并将errno设置为EAGAIN否则将使得进程进入睡眠直到以下情况发生[1]semval变为0[2]信号量被删除 将导致semop()出错退出错误码为EIDRM[3]收到信号 将导致semop()出错退出错误码为EINTR3当sem_op小于0时申请资源进行P操作即信号量元素的值semval将会被减去sem_op的绝对值。如果semval大于或等于sem_op的绝对值则semop()立即成功返回semval的值将减去sem_op的绝对值并且如果SEM_UNDO被设置了那么该P操作将会被系统记录。
如果semval小于sem_op的绝对值并且设置了IPC_NOWAIT那么semop()将会出错返回且将错误码置为EAGIN否则将使得进程进入睡眠直到以下情况发生[1]semval的值变得大于或者等于sem_op的绝对值[2]信号量被删除 将导致semop()出错退出错误码为EIDRM[3]收到信号 将导致semop()出错退出错误码为EINTR 3、删除SEM对象 // 删除SEM对象
int semctl(int semid, int semnum, int cmd, ...);// 接口说明semid信号量组的IDsemnum信号量组内的元素序号从0开始cmd操作命令字IPC_STAT获取信号量组的一些信息放入结构体semid_ds中IPC_SET将结构体semid_ds中指定的信息设置到信号量组中IPC_RMID删除指定的信号量组GETALL获取所有信号量元素的值SETALL设置所有信号量元素的值GETVAL获取第semnum个信号量元素的值SETVAL设置第semnum个信号量的值 五、信号量组使用步骤 1、使用ftok()获取IPC通信对象KEY值 2、使用semget()获取SEM对象ID并判断是否需要进行初始化 3、使用semop()进行P/V操作操作信号量组 4、使用命令或者函数删除信号量组
六、案例 使用信号量组结合共享内存的方式完成两个进程的数据收发。 // 信号量组结合共享内存的案例#include stdio.h
#include unistd.h
#include string.h
#include sys/types.h
#include sys/ipc.h
#include sys/sem.h
#include sys/shm.h
#include errno.h// 编译时分两个版本一个直接编译另外一个把A的宏定义注释把B的宏定义展开
#define A 1
//#define B 1 // 编译第二版本时请去掉前面的注释同时注释A的宏定义// 注意A进程的P信号量与B进程的V信号量相对应所以要修改信号量序号的下标
#if A
#define DATA_P_NUM 0
#define DATA_V_NUM 1
#define SPACE_P_NUM 2
#define SPACE_V_NUM 3#elif B
#define DATA_P_NUM 1
#define DATA_V_NUM 0
#define SPACE_P_NUM 3
#define SPACE_V_NUM 2
#endif#define SEM_NUM 4 // 4个信号量
#define SEM_KEY 0x01
#define SHM_KEY 0x02
#define SHM_SIZE 4096int sem_id -1;
// 映射的虚拟地址
char *shm_addr NULL;// 信号量组初始化
int sem_init(void)
{// 1、获取IPC对象的KEY值key_t sem_key ftok(./, SEM_KEY);if(sem_key -1){perror(ftok fail);return -1;}// 2、获取SEM对象的ID, 申请4个信号量sem_id semget(sem_key, SEM_NUM, IPC_EXCL | IPC_CREAT | 0666);// 如果已经存在就不需要初始化直接获取if(sem_id -1 errno EEXIST){// 直接获取SEM对象IDsem_id semget(sem_key, SEM_NUM, IPC_CREAT | 0666);if(sem_id -1){perror(semget fail);return -1;}}// 不存在则需要在获取SEM对象ID后进行初始化else if(sem_id 0){sem_id semget(sem_key, SEM_NUM, IPC_CREAT | 0666);if(sem_id -1){perror(semget fail);return -1;}// 初始化semctl(sem_id, DATA_P_NUM, SETVAL, 0); // 初始值为0semctl(sem_id, DATA_V_NUM, SETVAL, 0); // 初始值为0semctl(sem_id, SPACE_P_NUM, SETVAL, 1); // 初始值为1semctl(sem_id, SPACE_V_NUM, SETVAL, 1); // 初始值为1}else{perror(semget fail);return -1;}
}// 共享内存初始化
int shm_init(void)
{// 1、获取KEY值key_t shm_key ftok(./, 1);if(shm_key -1){perror(ftok fail);return -1;}// 2、指定共享内存获取共享内存对象IDint shm_id shmget(shm_key, SHM_SIZE, IPC_CREAT | 0666);if(shm_id -1){perror(shmget fail);return -1;}// 3、映射共享内存shm_addr (char*)shmat(shm_id, NULL, 0);if(shm_addr (void*)-1){perror(shmat fail);return -1;}
}int main(int argc, char *argv[])
{int ret 0;ret sem_init();if(ret -1){return -1;}ret shm_init();if(ret -1){return -1;}// 接收数据 数据-1struct sembuf Data_P {.sem_flg SEM_UNDO,.sem_num DATA_P_NUM,.sem_op -1};// 发送数据 数据1struct sembuf Data_V {.sem_flg SEM_UNDO,.sem_num DATA_V_NUM,.sem_op 1};// 占用空间 空间-1struct sembuf Space_P {.sem_flg SEM_UNDO,.sem_num SPACE_P_NUM,.sem_op -1};// 释放空间 空间1struct sembuf Space_V {.sem_flg SEM_UNDO,.sem_num SPACE_V_NUM,.sem_op 1};pid_t pid fork();// 父进程负责发送数据if(pid 0){while(1){// 申请空间P操作printf(wait Space_P...\n);semop(sem_id, Space_P, 1);printf(get Space_P\n);printf(please input data: \n);fgets(shm_addr, SHM_SIZE, stdin);// 释放数据V操作semop(sem_id, Data_V, 1);printf(set Data_V, send data success\n);}}// 子进程负责接收数据else if(pid 0){while(1){// 申请数据P操作printf(wait Data_P...\n);semop(sem_id, Data_P, 1);printf(read Data: %s, shm_addr);memset(shm_addr, 0, SHM_SIZE);// 释放空间V操作semop(sem_id, Space_V, 1);printf(set Space_V\n);}}else{perror(fork fail);return -1;}return 0;
} 注编译时编译两个版本一个直接编译另外一个需要注释A的宏定义然后展开B的宏定义后才能编译第二个版本。 分析具体的PV操作这里不讲解为什么要申请4个信号量这个要讲明白的话很难有空再出另外一篇博客讲敬请留意。
七、总结 信号量组只能作为一种信号不能用来传递数据多用于使用P/V操作的场景可以同时操作多个信号量但是要实现传递数据必须配合其他通信方式如共享内存。可以结合案例来加深对信号量组的理解。 文章转载自: http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.lylkh.cn.gov.cn.lylkh.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.mzydm.cn.gov.cn.mzydm.cn http://www.morning.jjzxn.cn.gov.cn.jjzxn.cn http://www.morning.ysskn.cn.gov.cn.ysskn.cn http://www.morning.jwgmx.cn.gov.cn.jwgmx.cn http://www.morning.spwm.cn.gov.cn.spwm.cn http://www.morning.fbzdn.cn.gov.cn.fbzdn.cn http://www.morning.tmcmj.cn.gov.cn.tmcmj.cn http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn http://www.morning.mcqhb.cn.gov.cn.mcqhb.cn http://www.morning.tgxrm.cn.gov.cn.tgxrm.cn http://www.morning.jlthz.cn.gov.cn.jlthz.cn http://www.morning.mqzcn.cn.gov.cn.mqzcn.cn http://www.morning.nlkhr.cn.gov.cn.nlkhr.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.kycwt.cn.gov.cn.kycwt.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn http://www.morning.hnkkm.cn.gov.cn.hnkkm.cn http://www.morning.xwqxz.cn.gov.cn.xwqxz.cn http://www.morning.rrwft.cn.gov.cn.rrwft.cn http://www.morning.nsrtvu.com.gov.cn.nsrtvu.com http://www.morning.sthgm.cn.gov.cn.sthgm.cn http://www.morning.dygsz.cn.gov.cn.dygsz.cn http://www.morning.bnkcl.cn.gov.cn.bnkcl.cn http://www.morning.mlgsc.com.gov.cn.mlgsc.com http://www.morning.nlgnk.cn.gov.cn.nlgnk.cn http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn http://www.morning.hbywj.cn.gov.cn.hbywj.cn http://www.morning.xxhc.cn.gov.cn.xxhc.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.ywrt.cn.gov.cn.ywrt.cn http://www.morning.hhzdj.cn.gov.cn.hhzdj.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.gassnw.com.gov.cn.gassnw.com http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.ndfwh.cn.gov.cn.ndfwh.cn http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn http://www.morning.jfsbs.cn.gov.cn.jfsbs.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.hchrb.cn.gov.cn.hchrb.cn http://www.morning.jbxmb.cn.gov.cn.jbxmb.cn http://www.morning.yodajy.cn.gov.cn.yodajy.cn http://www.morning.wxccm.cn.gov.cn.wxccm.cn http://www.morning.srrrz.cn.gov.cn.srrrz.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.bxczt.cn.gov.cn.bxczt.cn http://www.morning.fglxh.cn.gov.cn.fglxh.cn http://www.morning.kyytt.cn.gov.cn.kyytt.cn http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn http://www.morning.rrcxs.cn.gov.cn.rrcxs.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.nktxr.cn.gov.cn.nktxr.cn http://www.morning.sfhjx.cn.gov.cn.sfhjx.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.ysnbq.cn.gov.cn.ysnbq.cn http://www.morning.rnnts.cn.gov.cn.rnnts.cn http://www.morning.pmftz.cn.gov.cn.pmftz.cn http://www.morning.kaylyea.com.gov.cn.kaylyea.com http://www.morning.wqpb.cn.gov.cn.wqpb.cn http://www.morning.yfffg.cn.gov.cn.yfffg.cn http://www.morning.kfcz.cn.gov.cn.kfcz.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn http://www.morning.tdxlj.cn.gov.cn.tdxlj.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.gpnwq.cn.gov.cn.gpnwq.cn http://www.morning.kgltb.cn.gov.cn.kgltb.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.lpzyq.cn.gov.cn.lpzyq.cn http://www.morning.rgrz.cn.gov.cn.rgrz.cn http://www.morning.bkwd.cn.gov.cn.bkwd.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.pluimers.cn.gov.cn.pluimers.cn