亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

信號量、消息隊列、共享內存復習

2019-11-10 20:18:47
字體:
來源:轉載
供稿:網友

信號量代碼

使用信號量實現父子進程間同步:

#include <sys/sem.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for ipC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (linux-specific) */};void pv(int sem_id, int op) { struct sembuf sem_b; sem_b.sem_num = 0; sem_b.sem_op = op; sem_b.sem_flg = SEM_UNDO; semop(sem_id, &sem_b, 1); }int main(int argc, char** argv){ int sem_id = semget(IPC_PRIVATE, 1, 0666); union semun sem_un; sem_un.val = 1; semctl(sem_id, 0, SETVAL, sem_un); pid_t pid = fork(); if(pid < 0) return -1; else if(pid == 0){ printf("child try to get binary sem/n"); pv(sem_id, -1); printf("child get the sem and would release it after 5 seconds/n"); sleep(5); pv(sem_id, 1); exit(0); } else{ printf("parent try to get binary sem/n"); pv(sem_id, -1); printf("parent get the sem and would release it agter 5 SEOcnds/n"); sleep(5); pv(sem_id, 1); } waitpid(pid, NULL, 0); semctl(sem_id, 0, IPC_RMID, sem_un); return 0;}

消息隊列代碼

使用消息隊列實現簡單的進程間交談。

utili.h頭文件:

#pragma once#include <stdio.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdlib.h>#include <string.h>const char* const PATH_NAME = "pathname";const int PRO_ID = 0xff;const int BUFFER_SIZE = 256;struct message { long msg_type; char msg_text[BUFFER_SIZE];};

server.cpp:

#include "utili.h"const int SERVER_MSG_SND_TYPE = 10000;const int SERVER_MSG_RCV_TYPE = 2;int main(){ int msg_id; if(msg_id = msgget(ftok(PATH_NAME, PRO_ID), IPC_CREAT | IPC_EXCL | 0755) < 0){ perror("what"); exit(-1); } printf("msg_id = %d/n", msg_id); message msg; for(; ;){ printf("server:>"); scanf("%s", msg.msg_text); if(strncasecmp(msg.msg_text, "quit", 4) == 0) break; msg.msg_type = SERVER_MSG_SND_TYPE; msgsnd(msg_id, &msg, strlen(msg.msg_text)+1, 0); msgrcv(msg_id, &msg, BUFFER_SIZE, SERVER_MSG_RCV_TYPE, 0); printf("client:>%s/n", msg.msg_text); } msgctl(msg_id, IPC_RMID, 0); while(1); exit(0);

客戶端:

#include "utili.h"const int CLIENT_MSG_SND_TYPE = 2;const int CLIENT_MSG_RCV_TYPE = 10000;int main(){ int msg_id; key_t msg_key = ftok(PATH_NAME, PRO_ID); if(msg_key < 0){ perror("what1"); exit(-1); } printf("msg_key = %d/n", msg_key); if((msg_id = msgget(msg_key, 0)) < 0){ perror("what2"); exit(-1); } printf("mid_id = %d/n", msg_id); message msg; for(; ;){ msgrcv(msg_id, &msg, BUFFER_SIZE, CLIENT_MSG_RCV_TYPE, 0); printf("serverhehf:>%s/n", msg.msg_text); printf("clientwowo:>"); scanf("%s", msg.msg_text); if(strncasecmp(msg.msg_text, "quit", 4) == 0) break; msg.msg_type = CLIENT_MSG_SND_TYPE; msgsnd(msg_id, &msg, strlen(msg.msg_text)+1, 0); } msgctl(msg_id, IPC_RMID, 0); exit(0);}

雙反接收和發送的消息類型不同,可以利用這點從消息隊列中取自己的消息。

昨天晚上寫消息隊列這個程序坑了我好長時間,沒有使用perror判斷錯誤外加沒有注意到ftok函數針對的path必須是真實存在的文件或目錄,然后找BUG找了一個半多小時。

共享內存代碼

這里使用共享內存來實現服務器和客戶端通信,并且由于共享了讀寫,使用信號量來同步。

utili.h:

#include <stdio.h>#include <sys/shm.h>#include <sys/sem.h>#include <sys/ipc.h>#include <stdlib.h>#include <string.h>#define PATHNAME "newfile"#define PRO_ID 0xff#define err_exit(m) / do{ / perror(m); / exit(1); / }while(0)#define USE_SEMunion semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO*/ };

server.cpp:

#include "utili.h"int main(int argc, char** argv){ int shm_id; if( (shm_id = shmget(ftok(PATHNAME, PRO_ID), 1024, IPC_CREAT|IPC_EXCL|0755)) < 0) err_exit("shmget err."); char *ch; if( (ch = (char *)shmat(shm_id, NULL, 0)) == (void *)-1) err_exit("shmat err");#ifdef USE_SEM int sem_id; if( (sem_id = semget(ftok(PATHNAME, PRO_ID), 2, IPC_CREAT|IPC_EXCL|0755)) < 0){ shmdt(ch); shmctl(shm_id, IPC_RMID, 0); err_exit("semget err."); } union semun init; init.val = 0; semctl(sem_id, 0, SETVAL, init); //0 semctl(sem_id, 1, SETVAL, init); //1 struct sembuf p = {0, -1, 0}, v = {1, 1, 0};#endif for(; ;){ printf("server:>"); scanf("%s", ch); if(strncasecmp(ch, "quit", 4) == 0){ shmdt(ch); break; } semop(sem_id, &v, 1); semop(sem_id, &p, 1); printf("client:>%s/n", ch); } int res; if( (res = shmctl(shm_id, IPC_RMID, 0)) < 0) err_exit("remove err."); return 0;}

client.cpp:

#include "utili.h"int main(int argc, char** argv){ int shm_id; if( (shm_id = shmget(ftok(PATHNAME, PRO_ID), 0, 0)) < 0) err_exit("shmget err."); char *ch; if( (ch = (char *)shmat(shm_id, NULL, 0)) == (void *)-1) err_exit("shmat err");#ifdef USE_SEM int sem_id; if( (sem_id = semget(ftok(PATHNAME, PRO_ID), 0, 0)) < 0){ shmdt(ch); shmctl(shm_id, IPC_RMID, 0); err_exit("semget err."); } union semun init; init.val = 0; semctl(sem_id, 0, SETVAL, init); //0 semctl(sem_id, 1, SETVAL, init); //1 struct sembuf p = {1, -1, 0}, v = {0, 1, 0};#endif for(; ;){ semop(sem_id, &p, 1); printf("server:>%s/n", ch); printf("cli:>"); scanf("%s", ch); if(strncasecmp(ch, "quit", 4) == 0){ shmdt(ch); break; } semop(sem_id, &v, 1); } int res; if( (res = shmctl(shm_id, IPC_RMID, 0)) < 0) err_exit("remove err."); return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久一区| 欧美日韩在线视频一区| 亚洲男人天堂手机在线| 在线观看国产欧美| 中日韩美女免费视频网址在线观看| 亚洲福利视频网| 精品久久久久久久大神国产| …久久精品99久久香蕉国产| 国产网站欧美日韩免费精品在线观看| 国产精品国产三级国产aⅴ浪潮| 欧美激情亚洲一区| 国产精品久久久久久久久久三级| 俺去亚洲欧洲欧美日韩| 亚洲影院色无极综合| 91九色综合久久| 亚洲人成在线免费观看| 懂色av中文一区二区三区天美| 亚洲天堂av在线免费| 午夜精品一区二区三区在线| 91国偷自产一区二区三区的观看方式| 一本一本久久a久久精品综合小说| 亚洲欧美综合另类中字| 国产日韩av高清| 91精品国产91久久久久久最新| 欧美性受xxxx黑人猛交| 亚洲精品电影网站| 亚洲欧美日韩中文视频| 美女视频久久黄| 日韩午夜在线视频| 成人精品久久一区二区三区| 午夜精品久久久久久99热软件| 日韩久久免费电影| 九九热精品视频国产| 日韩电视剧在线观看免费网站| 97人洗澡人人免费公开视频碰碰碰| 国产日产亚洲精品| 国产有码在线一区二区视频| 久久亚洲精品一区| 丝袜美腿精品国产二区| 日本aⅴ大伊香蕉精品视频| 欧美国产视频日韩| 久久久久久高潮国产精品视| 91精品啪在线观看麻豆免费| 日韩麻豆第一页| 亚洲无av在线中文字幕| 91中文精品字幕在线视频| 亚洲视屏在线播放| 亚洲第一天堂av| 国产成人欧美在线观看| 日韩av电影免费观看高清| 日韩电影中文字幕一区| 欧美视频第一页| 日韩欧美福利视频| 97精品久久久| 91久久久久久久一区二区| 欧美国产激情18| 久久九九热免费视频| 精品国产一区二区三区久久狼5月| 国产精品久久久久久久久久久久| 久久精品电影网| 成人午夜小视频| 精品久久久久久电影| 日韩精品免费观看| 欧美精品亚州精品| 亚洲伊人成综合成人网| 久久久精品电影| 欧美成人免费在线视频| 亚州欧美日韩中文视频| 宅男66日本亚洲欧美视频| 日韩高清欧美高清| 国产精品看片资源| 亚洲精品之草原avav久久| 日本亚洲欧美三级| 精品动漫一区二区| 欧美性做爰毛片| 欧美成人黑人xx视频免费观看| 国产精品wwwwww| 日韩大陆欧美高清视频区| 91a在线视频| 欧美视频免费在线| 亚洲男人天天操| 综合网日日天干夜夜久久| 91精品国产高清久久久久久久久| 国产97在线视频| 亚洲国产精彩中文乱码av在线播放| 97视频在线观看免费高清完整版在线观看| 992tv成人免费影院| 日韩精品视频在线观看免费| 69国产精品成人在线播放| 国模视频一区二区三区| 亚洲视频在线观看| 亚洲电影免费观看高清完整版在线| 欧美激情一区二区三区在线视频观看| 国产欧美 在线欧美| 欧美极品少妇xxxxⅹ裸体艺术| 国产999精品久久久| 亚洲黄页网在线观看| 久久国产精品亚洲| 成人a级免费视频| 色偷偷av亚洲男人的天堂| 国产亚洲a∨片在线观看| 精品中文字幕视频| 中文.日本.精品| 日本国产精品视频| 97超级碰碰碰久久久| 成人免费高清完整版在线观看| 中文字幕亚洲欧美日韩高清| 51精品在线观看| 欧美日韩午夜视频在线观看| 日本电影亚洲天堂| 日韩中文字幕在线视频| 日韩hd视频在线观看| 日韩电视剧在线观看免费网站| 91久久精品国产91性色| 91中文字幕在线观看| 日韩电影大片中文字幕| 国产精品视频久久久久| 国产精品免费小视频| 欧美老肥婆性猛交视频| 亚洲免费人成在线视频观看| 国产一区av在线| 日韩av免费看| 欧美亚洲成人精品| 国产福利视频一区二区| 欧美老女人xx| 亚洲精品国产精品久久清纯直播| 国产精品a久久久久久| 欧美成人四级hd版| 久久九九全国免费精品观看| 91在线播放国产| 55夜色66夜色国产精品视频| 国产美女被下药99| 成人在线视频网| 久久福利视频网| 国产午夜精品全部视频播放| 国产一区二区三区视频| 国产精品久久久久久久久久尿| 91精品久久久久久久久青青| 91久热免费在线视频| 欧美成人h版在线观看| 亚洲乱码一区av黑人高潮| 亚洲免费av电影| 国产亚洲精品久久久| 日本视频久久久| 日韩av网址在线| 国产一区二区黑人欧美xxxx| 日本久久精品视频| 久久国产精品久久精品| 欧美日韩美女在线| 日韩成人av在线播放| 亚洲第一精品久久忘忧草社区| 国产a级全部精品| 日韩成人av网| 亚洲级视频在线观看免费1级| 26uuu国产精品视频| 日韩免费电影在线观看| 亚洲色图色老头| 国产精品久久久久久久久久久久| 国产精品高潮呻吟视频| 在线激情影院一区| 韩国福利视频一区| 成人午夜在线影院| 夜夜嗨av一区二区三区免费区| 久久人人爽人人爽人人片av高清|