操作系统课设之Linux 进程间通信
前言
課程設(shè)計(jì)開(kāi)始了,實(shí)驗(yàn)很有意思,寫(xiě)博客總結(jié)學(xué)到的知識(shí)
白嫖容易,創(chuàng)作不易,學(xué)到東西才是真
本文原創(chuàng),創(chuàng)作不易,轉(zhuǎn)載請(qǐng)注明!!!
本文鏈接
個(gè)人博客:https://ronglin.fun/archives/175
PDF鏈接:見(jiàn)博客網(wǎng)站
CSDN: https://blog.csdn.net/RongLin02/article/details/118308512
為了美觀,實(shí)驗(yàn)源代碼在結(jié)尾處,整合版見(jiàn)下
鏈接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取碼:Lin2
操作系統(tǒng)課程設(shè)計(jì)源代碼
本次操作系統(tǒng)課程設(shè)計(jì)合集
操作系統(tǒng)課設(shè)之Windows 進(jìn)程管理
操作系統(tǒng)課設(shè)之Linux 進(jìn)程管理
操作系統(tǒng)課設(shè)之Linux 進(jìn)程間通信
操作系統(tǒng)課設(shè)之Windows 的互斥與同步
操作系統(tǒng)課設(shè)之內(nèi)存管理
操作系統(tǒng)課設(shè)之虛擬內(nèi)存頁(yè)面置換算法的模擬與實(shí)現(xiàn)
操作系統(tǒng)課設(shè)之基于信號(hào)量機(jī)制的并發(fā)程序設(shè)計(jì)
操作系統(tǒng)課設(shè)之簡(jiǎn)單 shell 命令行解釋器的設(shè)計(jì)與實(shí)現(xiàn)
僅用于學(xué)習(xí),如有侵權(quán),請(qǐng)聯(lián)系我刪除
實(shí)驗(yàn)題目
Linux 進(jìn)程間通信
實(shí)驗(yàn)?zāi)康?/h1>
Linux 系統(tǒng)的進(jìn)程通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù),通過(guò)本實(shí)驗(yàn),理解熟悉 Linux 支持的消息通信機(jī)制。
實(shí)驗(yàn)內(nèi)容
實(shí)驗(yàn)原理:主要用到4個(gè)函數(shù)
int msgget(key_t key, int msgflag);key:某個(gè)消息隊(duì)列的名字,用ftok()產(chǎn)生 (函數(shù)ftok的返回值)或IPC_PRIVATE,獲取消息隊(duì)列的標(biāo)識(shí)符,創(chuàng)建和訪問(wèn)一個(gè)消息隊(duì)列。
int msgctl(int msqid, int cmd, struct msqid_ds *buf);msqid:消息隊(duì)列標(biāo)識(shí)符,由msgget獲得;
cmd:控制標(biāo)識(shí)符,IPC_SET 命令:設(shè)置屬主的用戶標(biāo)識(shí)符和組標(biāo)識(shí)符,IPC_STAT 和 IPC_INFO 命令:獲得資源狀態(tài)信息,IPC_RMID 命令:釋放這個(gè)資源;
buf:消息隊(duì)列管理結(jié)構(gòu)體,請(qǐng)參見(jiàn)消息隊(duì)列內(nèi)核結(jié)構(gòu)說(shuō)明部分。
msqid:消息隊(duì)列標(biāo)識(shí)符;
msgp:發(fā)送給隊(duì)列的消息。msgp可以是任何類型的結(jié)構(gòu)體,但第一個(gè)字段必須為long類型,即表明此發(fā)送消息的類型,msgrcv根據(jù)此接收消息。msgp定義的參照格式如下:
msgsz:要發(fā)送消息的大小,不含消息類型占用的4個(gè)字節(jié),即mtext的長(zhǎng)度;
msgflg:控制位,規(guī)定當(dāng)核心用盡內(nèi)部緩沖空間時(shí)應(yīng)執(zhí)行的動(dòng)作
msqid:消息隊(duì)列標(biāo)識(shí)符;
msgp:存放消息的結(jié)構(gòu)體,結(jié)構(gòu)體類型要與msgsnd函數(shù)發(fā)送的類型相同;
msgsz:要接收消息的大小,不含消息類型占用的4個(gè)字節(jié);
msgtyp:0:接收第一個(gè)消息;>0:接收類型等于msgtyp的第一個(gè)消息;<0:接收類型等于或者小于msgtyp絕對(duì)值的第一個(gè)消息;
msgflg:規(guī)定倘若該隊(duì)列無(wú)消息,核心應(yīng)當(dāng)做什么事,如果此時(shí)設(shè)置了 IPC_NOWAIT 標(biāo)志,則
立即返回,若在 flag 中設(shè)置了 MSG_NOERROR,且所接收的消息大小大于 size ,核心截?cái)嗨邮盏南ⅰ?br /> msgrcv()解除阻塞的條件有以下三個(gè):
1.消息隊(duì)列中有了滿足條件的消息。
2.msqid代表的消息隊(duì)列被刪除。
3.調(diào)用msgrcv()的進(jìn)程被信號(hào)中斷。
用以上4個(gè)函數(shù)實(shí)現(xiàn)Linux系統(tǒng)下的通信。
實(shí)驗(yàn)步驟:
在Linux虛擬機(jī)下,用codeblocks新建一個(gè)project,將指導(dǎo)書(shū)的代碼copy到main.cpp文件下,多次運(yùn)行查看結(jié)果。
關(guān)鍵代碼如下:
四、實(shí)驗(yàn)結(jié)果與分析
運(yùn)行結(jié)果如下:
多次結(jié)果運(yùn)行結(jié)果均為上,只有極少數(shù)運(yùn)行結(jié)果是client發(fā)送一條server接受一條。
對(duì)于以上結(jié)果,查閱資料可知:
message的傳送和控制并不保證完全同步,當(dāng)一個(gè)程序不再激活狀態(tài)的時(shí)候,它完全可能繼續(xù)睡眠,造成上面現(xiàn)象,在多次send message后才receive message.這一點(diǎn)有助于理解消息轉(zhuǎn)送的實(shí)現(xiàn)機(jī)理。
消息通信的特點(diǎn):消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。消息的傳遞,自身就帶有同步的控制.當(dāng)?shù)鹊较⒌臅r(shí)候,進(jìn)程進(jìn)入睡眠狀態(tài),不再消耗CPU資源。
小結(jié)與心得體會(huì)
由于main函數(shù)兩次fork(),最開(kāi)始我認(rèn)為server也會(huì)fork()出client子進(jìn)程,也就是,我認(rèn)為作為子進(jìn)程的server還會(huì)生成”孫”進(jìn)程,但是多次運(yùn)行調(diào)試后,結(jié)果并不是我想的那樣,單步調(diào)試加測(cè)試輸出之后,我發(fā)現(xiàn)了 exit(0),它在子函數(shù)里邊,也就是說(shuō)在執(zhí)行完server()/client()子函數(shù)之后,子進(jìn)程直接結(jié)束,不再返回main()函數(shù)。
對(duì)于Linux進(jìn)程通信,之前了解的比較少,只是聽(tīng)說(shuō)過(guò)管道的概念。這次驗(yàn)證實(shí)驗(yàn)了解了Linux進(jìn)程間通信的基本方法,獲益匪淺。
=w=
源代碼
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #include <unistd.h> #include<sys/wait.h> #define MSGKEY 75 struct msgform {long mtype;char mtext[1030]; } msg; int msgqid,i; void CLIENT() {int i;//flag 本身由操作允許權(quán)和控制命令值相“或”得到。msgqid=msgget(MSGKEY,0777);for (i=10; i>=1; i--){msg.mtype=i;printf("(client) sent \n");//flag 規(guī)定當(dāng)核心用盡內(nèi)部緩沖空間時(shí)應(yīng)執(zhí)行的動(dòng)作msgsnd(msgqid,&msg,1024,0);}exit(0); } void SERVER() {//IPC_CREAT | 0400 是否該隊(duì)列應(yīng)被創(chuàng)建;msgqid=msgget(MSGKEY,0777|IPC_CREAT);do{//type 是用戶要讀的消息類型:msgrcv(msgqid,&msg,1030,0,0);printf("(Server) recieved\n");}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);exit(0); } int main() {while((i=fork())==-1);if(!i)SERVER();while((i=fork())==-1);if(!i)CLIENT();wait(0);wait(0);return 0; }總結(jié)
以上是生活随笔為你收集整理的操作系统课设之Linux 进程间通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 烽火交换机s5800配置说明_如何通过单
- 下一篇: 操作系统课设之Linux 进程管理