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
原创粉丝点击