linux进程通讯之信号量
来源:互联网 发布:win10在端口23连接失败 编辑:程序博客网 时间:2024/05/22 01:49
参考http://blog.csdn.net/ljianhui/article/details/10243617
在学习信号量时,我们要理顺linux提供两种信号量
下面主要针对SYSTEM V举例
功能:父子进程间通过两个信号量实现同步。
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#definePATHNAME/home/smb/test/2-4-1/test.c#defineSEM_NUM2union semun{int val;struct semid_ds *buf;unsigned short *arry;};//sem:信号标示符,index:信号灯编号, value:信号初始值int set_semval(int sem, int index, int value){union semun sem_union;sem_union.val = value;if(semctl(sem, index,SETVAL,sem_union) == -1){return 0;}return 1;}//sem:信号标示符,sops:带操作信号数组, index:信号灯编号int sem_p(int sem, struct sembuf *sops, int index){sops->sem_num = index;sops->sem_op = -1;sops->sem_flg=SEM_UNDO;if(semop(sem, sops, 1) == -1){return 0;}return -1;}int sem_v(int sem, struct sembuf *sops, int index){sops->sem_num = index;sops->sem_op = 1;sops->sem_flg=SEM_UNDO;if(semop(sem, sops, 1) == -1){return 0;}return -1;}int main(void){key_t key;int err;int sem_id;int i;int pid;struct sembuf sops[2];key = ftok("PATHNAME",'a');printf("key=%d\n",key);sem_id = semget(key,2,IPC_CREAT|0777);if(sem_id == -1){printf("semget fail\n");exit(EXIT_FAILURE);}/*初始化信号集*/for(i=0;i<SEM_NUM;i++){err = set_semval(sem_id, i, 1);if(!err){printf("sem_set_val fail:i=%d\n",i);exit(EXIT_FAILURE);}}if( (pid=fork()) <0){printf("fork fail\n");exit(EXIT_FAILURE);}if(pid>0){/*等待信号量sem_1*/err = sem_p(sem_id, &sops[0], 0);if(!err){printf("sem_p fail:i=%d\n",0);exit(EXIT_FAILURE);}printf("father get sem_1\n");/*释放信号量sem_1*/err = sem_v(sem_id, &sops[0], 0);if(!err){printf("sem_v fail:i=%d\n",0);exit(EXIT_FAILURE);}printf("father release sem_1\n");sleep(5);/*等待信号量sem_2*/err = sem_p(sem_id, &sops[1], 1);if(!err){printf("sem_p fail:i=%d\n",1);exit(EXIT_FAILURE);}printf("father get sem_2\n");}else{sleep(2);/*等待信号量sem_1*/err = sem_p(sem_id, &sops[0], 0);if(!err){printf("sem_p fail:i=%d\n",0);exit(EXIT_FAILURE);}printf("child get sem_1\n");/*等待信号量sem_2*/err = sem_p(sem_id, &sops[1], 1);if(!err){printf("sem_p fail:i=%d\n",1);exit(EXIT_FAILURE);}printf("child get sem_2\n");/*释放信号量sem_2*/err = sem_v(sem_id, &sops[1], 1);if(!err){printf("sem_p fail:i=%d\n",1);exit(EXIT_FAILURE);}printf("child release sem_2\n");}}
运行结果:
0 0
- linux进程通讯之信号量
- Linux进程间通讯之信号量
- Linux进程间通讯之信号量sem
- linux 进程间通讯--信号量
- Linux中进程通讯--信号量
- (四)linux进程通讯、信号量
- Linux—进程间通讯—信号量
- 进程间通讯之信号量(实例)
- Linux进程间通讯四--信号量通讯机制
- 进程通讯-信号量
- 进程间通讯:信号量
- 进程间通讯--信号量
- Linux进程通信之信号量
- linux 进程通信之 信号量
- linux进程通信之信号量
- Linux--进程通信之信号量
- linux进程间通讯-System V IPC 信号量
- Linux笔记_进程通讯——信号量
- 传播系数
- 《Head First 设计模式》学习笔记——命令模式
- 1
- 10.黑马程序员-description方法、SEL
- 红黑树与二叉树
- linux进程通讯之信号量
- javascript语法详解(七)------流程控制
- PHP 文件操作类(创建文件并写入) 生成日志
- poj3126
- 蘸逝盎合凡勾迟屏蛋赡旱次陆谡兴
- Blend for Visual Studio 在Windows 8 上只支持Windows应用商店的应用开发……
- 比大小
- 在项目中提示找不到Box2D.h头文件
- 想想今年要干的事