- 例程說(shuō)明:
- 執(zhí)行server 兩個(gè)client
- 在server 儲(chǔ)存 內(nèi)容
- 兩個(gè)client 進(jìn)行讀取內(nèi)容
- 三個(gè)進(jìn)行程使用信號(hào)量進(jìn)行同步
- 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;
- //打開一個(gè)信號(hào)集
- semque_id = open_semque();
- //初始化信號(hào)量
- set_sem(semque_id, 1);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信號(hào)集中第一個(gè)信號(hào)量的值為:%d\n",ret);
- fputs("設(shè)置共享內(nèi)存\n",stdout);
- //打開一個(gè)共享儲(chǔ)存
- int id_shm = open_shm();
- int count = 3;
- while(count--)
- {
- ret = semctl(semque_id, 0, GETVAL);
- printf("信號(hào)集中第一個(gè)信號(hào)量的值為:%d\n",ret);
- v_sem(semque_id);
- fputs("執(zhí)行V操作\n",stdout);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信號(hào)集中第一個(gè)信號(hào)量的值為:%d\n",ret);
- fputs("輸入發(fā)送內(nèi)容\n",stdout);
- char buf[100];
- memset(buf,100,0);
- scanf("%s",buf);
- //獲取共享儲(chǔ)存第一個(gè)有效地址
- 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èi)容發(fā)送完成\n",stdout);
- printf("\n");
- fputs("執(zhí)行P操作\n",stdout);
- p_sem(semque_id);
- sleep(1);
- }
- fputs("是否刪除共享內(nèi)存退出 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("信號(hào)集中第一個(gè)信號(hào)量的值為:%d\n",ret);
- while(1)
- {
- fputs("執(zhí)行操作V\n",stdout);
- v_sem(semque_id);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信號(hào)集中第一個(gè)信號(hào)量的值為:%d\n",ret);
- fputs("讀取服務(wù)器內(nèi)容\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("執(zhí)行操作P\n",stdout);
- p_sem(semque_id);
- ret = semctl(semque_id, 0, GETVAL);
- printf("信號(hào)集中第一個(gè)信號(hào)量的值為:%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 三種用戶都沒有執(zhí)行權(quán)限
- 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}
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)醴陵免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
名稱欄目:unix共享儲(chǔ)存及信號(hào)量例程
分享網(wǎng)址:http://jinyejixie.com/article28/podgcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站策劃、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)