【linux】信号量
来源:互联网 发布:新浪微盾网络异常 编辑:程序博客网 时间:2024/06/10 22:52
信号量:
互斥:P、V在同一个进程中。
进程A当进行P操作,信号量资源数减1,比如信号量资源个数设置为1,p操作后就会变0. 进程B再进行P操作,信号量资源数变为-1,开始阻塞该进程。进程A进行V操作,释放信号量资源+1,信号量资源数变为0.开始唤醒B进程。B进程执行结束后,执行V操作,释放信号量资源,此时会变为1.
#include "sem.h"int sem_creat(int key){ int semid; semid = semget(key,1,0666|IPC_CREAT);// 1表示信号量的个数 return semid;}int sem_open(int key){ int semid; semid = semget(key,1,0666); return semid;}int sem_set(int semid,int semnu){ union semun set_1; int ret; set_1.val = semnu; // 表示信号量的下标,即你开辟了这么多个信号量,你要用哪个呢? ret = semctl(semid,0,SETVAL,set_1); return ret;}int sem_get(int semid){ union semun set_1; int ret; ret = semctl(semid,0,GETVAL,set_1); return set_1.val;}int set_p(int semid){ struct sembuf sops = {0,-1,0};// p 操作表示可用资源数减1 int ret = semop(semid,&sops,1); return ret;}int set_v(int semid){ struct sembuf sops = {0,1,0}; int ret = semop(semid,&sops,1);// v 操作表示可用资源数加1 return ret;}int main(){ int semid = sem_creat(0x1233); int ret = sem_set(semid,1); if(ret == -1) { printf("set value is error.....\n"); } ret = sem_get(semid); if(ret != -1) printf("get value is %d \n",ret); pid_t pid = fork(); set_p(semid);// sleep(3); printf("pid is %d \n\n",getpid()); set_v(semid);}
阅读全文
0 0
- linux信号量
- linux 信号量
- linux 信号量
- Linux信号量
- linux信号量
- linux 信号量
- Linux信号量
- Linux信号量
- linux信号量
- linux 信号量
- linux 信号量
- Linux 信号量
- linux信号量
- linux 信号量
- Linux 信号量
- Linux 信号量
- linux信号量
- linux 信号量
- vps环境搭建+vultr
- html截取显示部分的img图片
- MDK软件Go TO Definition 'xxxxx' 时出现No Browese information available in'X:\...\...\output\'
- WebDriver下载地址
- HIVE学习笔记:HIVE内置的三种表格式与表的划分
- 【linux】信号量
- mybatis错误:Invalid bound statement (not found)
- 51Nod-1371-填数字
- JDBC编程-优化程序(六)
- Hdu 5875 Function 线段树
- 建立J2EE开发环境
- 字符串trim()
- [ElasticStack系列]docker部署logstash
- OJ 2552: 好好学习天天向上