ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux网络编程-进程间通信——信号量

2022-02-19 22:00:49  阅读:139  来源: 互联网

标签:信号量 semid int 间通信 sops linux sem include


  1 #include<sys/types.h>
  2 #include<sys/ipc.h>
  3 #include<sys/sem.h>
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include<errno.h>
  7 
  8 int gSemid = 0;
  9 typedef int sem_t;
 10 #define ERR_EXIT(m) \
 11         do \
 12         { \
 13             perror(m); \
 14             exit(EXIT_FAILURE); \
 15         }while(0)
 16 
 17 sem_t CreateSem(key_t key, int value)
 18 {
 19     union semun sem;
 20     sem_t semid;
 21     sem.val = value;
 22 
 23     semid = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);//创建信号量个数为1
 24     if(-1 == semid)
 25     {
 26         ERR_EXIT("semget");
 27     }
 28     semctl(semid, 0, SETVAL, sem);//参数2-要操作的信号量在信号量集中的编号;参数3-cmd...
 29     
 30     return semid;
 31 }
 32 
 33 int Sem_P(sem_t semid)
 34 {
 35     //sops有三种方式,0-默认阻塞、IPC_NOWAIT-非阻塞、SEM_UNDO-撤销上一次操作
 36     struct sembuf sops={0,-1,0};
 37     return (semop(semid,&sops,1));
 38 }
 39 
 40 int Sem_V(sem_t semid)
 41 {
 42     struct sembuf sops={0,+1,0};
 43     return (semop(semid,&sops,1));
 44 }
 45 
 46 void SetvalueSem(sem_t semid, int value)
 47 {
 48     union semun sem;
 49     sem.val = value;
 50     
 51     semctl(semid,0,SETVAL,sem);
 52 }
 53 
 54 int GetvalueSem(sem_t semid)
 55 {
 56     union semun sem;
 57     return semctl(semid,0,GETVAL,sem);
 58 }
 59 
 60 void DestroySem(sem_t semid)
 61 {
 62     union semun sem;
 63     sem.val = 0;
 64     semctl(semid,0,IPC_RMID,sem);
 65 }
 66 
 67 void Print(char opChar)
 68 {
 69     int pauseTime;
 70     srand(getpid());
 71     int i;
 72 
 73     for(i=0; i<10; i++)
 74     {
 75         if(Sem_P(gSemid) != 0)
 76             ERR_EXIT("Sem_P");
 77         //临界区-begin
 78         printf("%c", opChar);
 79         fflush(stdout);
 80         pauseTime = rand()%3;
 81         sleep(pauseTime);
 82         printf("%c", opChar);
 83         fflush(stdout);
 84         //临界区-end
 85         Sem_V(gSemid);
 86         pauseTime = rand()%2;
 87         sleep(pauseTime);
 88     }
 89 }
 90 
 91 int main(void)
 92 {
 93     char i;
 94     key_t key;
 95     int value = 0;
 96     int pid;
 97         
 98     key = ftok("./ipc", 'c');
 99     gSemid = CreateSem(key,1);
100 
101     value = GetvalueSem(gSemid);
102     printf("信号量值 = %d\n",value);
103 
104     pid = fork();
105     if(-1 == pid)
106     {
107         ERR_EXIT("fork");
108     }
109 
110     if(pid > 0)//父进程
111     {
112         Print('o');
113         wait(NULL);//等待子进程推出,删除信号量集
114         DestroySem(gSemid);
115     }else//子进程
116     {
117         Print('x');
118     }
119     
120 #if 0
121     for(i = 0; i<105; i++)
122     {
123         if(Sem_P(gSemid) != 0)
124             ERR_EXIT("Sem_P");
125 
126         value = GetvalueSem(gSemid);
127         printf("信号量值 = %d\n",value);
128         
129         Sem_V(gSemid);
130         //value = GetvalueSem(semid);
131         //printf("信号量值 = %d\n",value);
132     }
133 #endif    
134     
135     return 0;
136 }

 

标签:信号量,semid,int,间通信,sops,linux,sem,include
来源: https://www.cnblogs.com/zzx2bky/p/15913777.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有