信号量的创建/打开,访问
来源:互联网 发布:知乎如何挑选钻戒 编辑:程序博客网 时间:2024/04/29 10:24
创建–>初始化–>设置信号量的值–>获取信号的值–>删除信号量
涉及到创建,操作,访问,还是IPC通信的三个步骤.semop等的分析放在后面
1.semcreate.c
#include"utili.h"int main(int argc, char *argv[]){ if(argc != 2) { printf("Arguments is error!"); exit(EXIT_FAILURE); } //创建IPC键 //pathname必须存在,进程必须可以访问 key_t sem_key = ftok(argv[1], 0xff);//第二个参数the least significant 8 bits of proj_id (which must be nonzero),低序8位不能为0 if(sem_key == -1) { perror("ftok error"); exit(EXIT_FAILURE); } //打开IPC通道i,成功返回信号标示符,反之返回-1 int sem_id = semget(sem_key, 1, IPC_CREAT | IPC_EXCL | 0755);//IPC_EXCL与IPC_CREAT一起使用,如果信号集已经存在,返回错误,errno置为EEXIST //如果不创建一个新的新的信号量集,而只是访问一个已经存在的集合,就可以将第二个参数的值指定为0 //第三个参数参照第二卷图3-5 if(sem_id == -1) { perror("semget"); exit(EXIT_FAILURE); } else printf("Create sem ok!\n"); return 0;}
2.semgetval.c
#include"utili.h"int main(int argc, char const* argv[]){ if(argc != 2) { printf("argc is error.\n"); exit(EXIT_FAILURE); } int sem_key = ftok(argv[1], 0xff); if(sem_key == -1) { perror("ftok"); exit(EXIT_FAILURE); } int sem_id = semget(sem_key, 0, 0); if(sem_id == -1) { perror("semget"); exit(EXIT_FAILURE); } int res = semctl(sem_id, 0, GETVAL);//卷二P231,如果成功GETVAL,将获得信号量的值作为函数的返回值 if(res == -1) perror("semctl"); else printf("semval:>%d\n", res); return 0;}
3.semsetval.c
#include"utili.h"union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */};int main(int argc, char const* argv[]){ if(argc != 3) { printf("argc is error!\n"); exit(EXIT_FAILURE); } union semun val; val.val = (atoi)(argv[2]); key_t sem_key = ftok(argv[1], 0xff); if(sem_key == -1) { perror("ftok"); exit(EXIT_FAILURE); } int sem_id = semget(sem_key, 0, 0); int res = semctl(sem_id, 0, SETVAL, val); if(res == -1) { perror("semctl"); } else printf("Set semval ok.\n"); return 0;}
4.semops.c
/*semop 对一个或者多个信号量进行操作+ - 0 * */#include"utili.h"int main(int argc, char const* argv[]){ if(argc != 3) { printf("argc is not 3\n"); exit(EXIT_FAILURE); } struct sembuf opsptr; opsptr.sem_num = 0; opsptr.sem_op = (atoi)(argv[2]); opsptr.sem_flg = 0; key_t sem_key = ftok(argv[1], 0xff); if(sem_key == -1) { perror("ftok"); exit(EXIT_FAILURE); } int sem_id = semget(sem_key, 0, 0); if(sem_id == -1) { perror("semget"); exit(EXIT_FAILURE); } int res = semop(sem_id, &opsptr, 1); if(res == -1) { perror("semop"); exit(EXIT_FAILURE); } else printf("Semop Ok\n"); return 0;}
5.semrmid.c
#include"utili.h"int main(int argc, char *argv[]){ if(argc != 2) { printf("args is error!"); exit(EXIT_FAILURE); } key_t sem_key = ftok(argv[1], 0xff); if(sem_key == -1) { perror("ftok"); exit(EXIT_FAILURE); } int sem_id = semget(sem_key, 0, 0); int res = semctl(sem_id, 0, IPC_RMID); if(res == -1) printf("Remove sem error!\n"); else printf("Remove sem ok!\n"); return 0;}
6.utili.h
#include<stdio.h>#include<unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include<stdlib.h>#include<sys/sem.h>
7.Makefile
ALL:semcreate semrmid semsetval semgetval semopssemcreate:semcreate.c gcc semcreate.c -o semcreatesemrmid:semrmid.c gcc semrmid.c -o semrmidsemgetval:semgetval.c gcc semgetval.c -o semgetvalsemops:semops.c gcc semops.c -o semopssemsetval:semsetval.c gcc semsetval.c -o semsetvalclean: /bin/rm -f semcreate semgetval semops semrmid semsetval
1 0
- 信号量的创建/打开,访问
- 信号量的创建和删除
- 信号量实现多进程的同步访问
- 创建信号量
- 有名信号量sem_open和内存信号量sem_init创建信号量的区别
- excel的创建打开
- Semaphore (信号量)管理访问数据的线程个数
- Java: 使用信号量(Semaphore)保护多个共享资源的访问
- 创建信号量semget
- 创建信号量RACSignal
- VxWorks下消息、信号量的使用和任务创建
- VxWorks下消息、信号量的使用和任务创建
- Win32 线程的创建&信号量临界资源&事件对象
- 打开MySQL数据库远程访问的权限
- 打开MySQL数据库远程访问的权限
- 打开MySQL数据库远程访问的权限
- 访问的网页自动打开QQ对话
- 打开MySQL数据库远程访问的权限
- 近期博客更新频次降低之说明
- Extjs Ajax 提交方式 Form.doAction('submit',...)和 Ext.Ajax.request的返回值
- 微信公众号开发之自定义菜单
- PHP SESSION实例
- hdu1166线段树的点跟新模板
- 信号量的创建/打开,访问
- BZOJ 3343: 教主的魔法
- java学习第十二天之多线程死锁和并发
- OpenCV 自带例程总结
- 微信公众号开发之授权获取用户信息
- Convert sorted list to binary search tree
- Mutual Training for Wannafly Union #6 [SPOJ
- XSS攻击
- Code for Machine Learning Diagnostic