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