日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

操作系统课设之Linux 进程间通信

發布時間:2025/3/15 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统课设之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:消息隊列管理結構體,請參見消息隊列內核結構說明部分。

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

msqid:消息隊列標識符;
msgp:發送給隊列的消息。msgp可以是任何類型的結構體,但第一個字段必須為long類型,即表明此發送消息的類型,msgrcv根據此接收消息。msgp定義的參照格式如下:

struct s_msg{ /*msgp定義的參照格式*/long type; /* 必須大于0,消息類型 */char mtext[256]; /*消息正文,可以是其他任何類型*/} msgp;

msgsz:要發送消息的大小,不含消息類型占用的4個字節,即mtext的長度;
msgflg:控制位,規定當核心用盡內部緩沖空間時應執行的動作

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int 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文件下,多次運行查看結果。
關鍵代碼如下:

#define MSGKEY 75 struct msgform {long mtype;char mtext[1030]; } msg; int msgqid,i; void CLIENT() {int i;msgqid=msgget(MSGKEY,0777);for (i=10; i>=1; i--){msg.mtype=i;printf("(client) sent \n");msgsnd(msgqid,&msg,1024,0);}exit(0); } void SERVER() {msgqid=msgget(MSGKEY,0777|IPC_CREAT);do{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; }

四、實驗結果與分析
運行結果如下:

多次結果運行結果均為上,只有極少數運行結果是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 进程间通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。