unix 共享储存及信号量例程
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,例程说明:执行server 两个client在server 储存 内容两个client 进行读取内容三个进行程使用信号量进行同步server.c----------------------------
千家信息网最后更新 2026年10月31日unix 共享储存及信号量例程
- 例程说明:
- 执行server 两个client
- 在server 储存 内容
- 两个client 进行读取内容
- 三个进行程使用信号量进行同步
- server.c
- -----------------------------------------------------
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/sem.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include "sem_shm.h"
- int main(int argc,char** argv)
- {
- int ret;
- int semque_id;
- //打开一个信号集
- semque_id = open_semque();
- //初始化信号量
- set_sem(semque_id, 1);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信号集中第一个信号量的值为:%d\n",ret);
- fputs("设置共享内存\n",stdout);
- //打开一个共享储存
- int id_shm = open_shm();
- int count = 3;
- while(count--)
- {
- ret = semctl(semque_id, 0, GETVAL);
- printf("信号集中第一个信号量的值为:%d\n",ret);
- v_sem(semque_id);
- fputs("执行V操作\n",stdout);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信号集中第一个信号量的值为:%d\n",ret);
- fputs("输入发送内容\n",stdout);
- char buf[100];
- memset(buf,100,0);
- scanf("%s",buf);
- //获取共享储存第一个有效地址
- char * addr = (char *)shmat(id_shm, 0, 0);
- if((void*)addr == (void*)-1)
- {
- perror("shmat\n");
- exit(1);
- }
- memset(addr,100,0);
- strncpy(addr,buf,100);
- fputs("内容发送完成\n",stdout);
- printf("\n");
- fputs("执行P操作\n",stdout);
- p_sem(semque_id);
- sleep(1);
- }
- fputs("是否删除共享内存退出 y or n\n",stdout);
- if(getchar()=='y')
- {
- shmctl(id_shm, IPC_RMID, NULL);
- }
- return 0;
- }
- -----------------------------------------------------
- client.c
- -----------------------------------------------------
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdlib.h>
- #include <sys/shm.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include "sem_shm.h"
- int main(int argc,char** argv)
- {
- int ret;
- int semque_id = open_semque();
- int shm_id = open_shm();
- ret = semctl(semque_id, 0, GETVAL);
- printf("信号集中第一个信号量的值为:%d\n",ret);
- while(1)
- {
- fputs("执行操作V\n",stdout);
- v_sem(semque_id);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信号集中第一个信号量的值为:%d\n",ret);
- fputs("读取服务器内容\n",stdout);
- char * addr = (char *)shmat(shm_id, 0, SHM_RDONLY);
- if((void*)addr == (void*)-1)
- {
- perror("shmat\n");
- exit(1);
- }
- fflush(stdout);
- fputs(addr,stdout);
- printf("\n");
- fputs("执行操作P\n",stdout);
- p_sem(semque_id);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信号集中第一个信号量的值为:%d\n",ret);
- sleep(1);
- }
- //semctl(semque_id, 0, IPC_RMID);
- return 0;
- }
- -----------------------------------------------------
- sem_shm.c
- -----------------------------------------------------
- #include "sem_shm.h"
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdlib.h>
- #include <sys/shm.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- int open_semque(void)
- {
- key_t key = ftok("./",100);
- if(key == -1)
- {
- perror("ftok\n");
- exit(1);
- }
- int semque_id = semget(key, 1,IPC_CREAT|0666);
- if(semque_id == -1)
- {
- perror("msgget\n");
- exit(1);
- }
- return semque_id;
- }
- void set_sem(int semque_id, int val)
- {
- union semun sem_union;
- sem_union.val = val;
- if(semctl(semque_id, 0, SETVAL, sem_union) == -1)
- {
- perror("semctl_set\n");
- exit(1);
- }
- }
- int open_shm()
- {
- key_t key = ftok("../",100);
- if(key == -1)
- {
- perror("ftok\n");
- exit(1);
- }
- //0666表示user group other 三种用户都没有执行权限
- int id_shm = shmget(key, SHM_SIZE, IPC_CREAT|0666);
- if(-1 == id_shm)
- {
- perror("shmget\n");
- exit(1);
- }
- return id_shm;
- }
- void p_sem(int semque_id)
- {
- struct sembuf arry[1];
- arry[0].sem_num = 0;
- arry[0].sem_op = 1;
- //arry[0].sem_flg = SEM_UNDO;
- int ret = semop(semque_id, arry, 1);
- if(ret)
- {
- perror("semop\n");
- exit(1);
- }
- }
- void v_sem(int semque_id)
- {
- struct sembuf arry[1];
- arry[0].sem_num = 0;
- arry[0].sem_op = -1;
- //arry[0].sem_flg = IPC_NOWAIT;
- //arry[0].sem_flg = SEM_UNDO;
- int ret = semop(semque_id, arry, 1);
- if(ret)
- {
- perror("semop\n");
- exit(1);
- }
- }
- -----------------------------------------------------
- sem_shm.h
- -----------------------------------------------------
- #ifndef SEM_SHM_H
- #define SEM_SHM_H
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #define SHM_SIZE 100
- int open_semque(void);
- void set_sem(int, int);
- void v_sem(int);
- void p_sem(int);
- int open_shm();
- union semun
- {
- int val;
- struct semid_ds buf;
- unsigned short *array;
- };
- #endif // end SEM_SHM_H
- -----------------------------------------------------
- makefile
- -----------------------------------------------------
- CC=gcc
- Target0=server
- Target1=client
- warn=-Wall
- ####################
- .PHONY: all clean # command: make all or make clean
- clean:
- rm -f $(obj) main server client *~ *gch *.o
- ###################
- all: $(Target0) $(Target1)
- $(Target0):server.o sem_shm.o
- $(CC) -o $@ $^ ${warn}
- server.o:server.c
- $(CC) -c $< ${warn}
- $(Target1):client.o sem_shm.o
- $(CC) -o $@ $^ ${warn}
- client.o:client.c
- $(CC) -c $< ${warn}
- sem_shm.o:sem_shm.c
- $(CC) -c $< ${warn}
信号
信号量
内容
两个
内存
有效
三个
地址
服务器
权限
用户
附件
同步
服务
输入
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳互联网科技公司
互联网 的科技创新
互联网科技上市公司
上海致骋互联网科技
金融科技和互联网金融
温州喔噻互联网科技有限公司
栖莱科技互联网股份有限公司
昭通互联网科技选哪家
互联网与医疗科技
广西互联网科技孵化中心
燊美集互联网科技有限公司
互联网公司黑科技创始人
华夏恒生科技与互联网科技
滨湖区互联网智能科技产品有哪些
国大互联网教育科技有限公司薪资
互联网科技快讯热点
下一代互联网重大应用科技园
萌小萌互联网科技河南有限公司
国产互联网科技公司
科技和互联网行业的特点
中智农互联网科技
上海卓越科技互联网
互联网科技活动banner
以房互联网科技
宁夏众和广鑫互联网科技有限公司
科技类公司包括互联网吗
徐州市互联网科技有限公司
科技互联网行业投资研究
互联网公司属于科技吗
宁波允成互联网科技有限公司