資源簡介
當程序運行時,父進程fork出4個子進程。父進程負責產生消息(每1s產生一個消息),4個子進程負責處理消息。父子進程之間通過消息隊列來傳遞消息。
父進程需要維護一個本地數據庫(格式與共享數據庫相同),當生成一個消息時,父進程要同步更新本地數據庫。子進程在處理消息時,根據消息的內容來對共享數據庫進行更新

代碼片段和文件信息
#include?“child.h“
int?count=0; /*每個子進程的運算次數*/
int?id;
/*終止子進程*/
void?killchild(){
????printf(“pid:%dcount:%d\n“getpid()count);
????exit(1);
}
/*刪除信號量*/
void?delete_sem(){
????if(semctl(id0?IPC_RMID?0)==-1){
????printf(“delete?sem?error\n“);
????}
????printf(“delete?sem?scuueed\n“);
}
/*收到消息*/
void?recieve_message(mqd_t?mqdchar?*addrint?semid){
????struct?mq_attr?mqattr;
????mq_getattr(mqd&mqattr);
????int?msg[mqattr.mq_msgsize];
????if((mq_receive(mqdmsgmqattr.mq_msgsizeNULL))!=-1){
P(semid); /*上鎖*/
if(msg[1]==1){
????addr[msg[0]]--;
}
else{
????addr[msg[0]]++;
}
V(semid); /*釋放鎖*/
count++;
????}
}
/*上鎖*/
void?P(int?id)
{
????struct?sembuf?sb[1]=?{0-1?0};
????semop(id?sb?1);
}
/*釋放鎖*/
void?V(int?id)
{
????struct?sembuf?sb[1]?=?{0?1?0};
????semop(id?sb?1);
}
/*初始化信號量*/
void?init_sem(int?semid){
????id=semid;
????semun?su={1};
????semctl(semid0SETVALsu);
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-08-14?09:54??吳月輝_操作系統編碼練習一\
?????目錄???????????0??2018-08-14?09:53??吳月輝_操作系統編碼練習一\test1\
?????文件?????????320??2018-08-10?14:28??吳月輝_操作系統編碼練習一\test1\Makefile
?????文件?????????993??2018-08-14?09:55??吳月輝_操作系統編碼練習一\test1\child.c
?????文件?????????382??2018-08-14?09:50??吳月輝_操作系統編碼練習一\test1\child.h
?????文件????????2155??2018-08-14?09:56??吳月輝_操作系統編碼練習一\test1\father.c
?????文件?????????414??2018-08-14?09:51??吳月輝_操作系統編碼練習一\test1\father.h
?????文件????????1328??2018-08-14?09:57??吳月輝_操作系統編碼練習一\test1\main.c
?????文件???????14680??2018-08-14?09:51??吳月輝_操作系統編碼練習一\test1\test1.exe
?????文件??????150016??2018-08-10?18:01??吳月輝_操作系統編碼練習一\運行說明及實驗截圖.doc
- 上一篇:PL/O語言編譯器
- 下一篇:計算機軟件的四種知識產權保護方式及其優缺點分析
評論
共有 條評論