作業系統 實驗三(程序間通訊) 3 3 3

2021-10-06 17:34:55 字數 1460 閱讀 9414

1、了解linux系統中程序通訊的基本原理。

2、分析程序競爭資源現象,學習解決程序互斥的方法。

使用系統呼叫msgget(),msgsnd(),msgrcv()及msgctl()編制一長度為1k的訊息傳送和接收的程式。

〈程式設計〉

(1)為了便於操作和觀察結果,用乙個程式為「引子」,先後fork()兩個子程序,server和client,進行通訊。

(2)server端建立乙個key為75的訊息佇列,等待其他程序發來的訊息。當遇到型別為1的訊息,則作為結束訊號,取消該佇列,並退出server。server每接收到乙個訊息後顯示一句「(server)received」。

(3)client端使用key為75的訊息佇列,先後傳送型別從10到1的訊息,然後退出。最後的乙個訊息,既是server端需要的結束訊號。client每傳送一條訊息後顯示一句「(client)sent」。

(4)父程序在server和client均退出後結束。

第一步

建立c資料夾,在它下面建立test.c檔案

mkdir c
vim test.c
第二步寫入參考程式程式struct msgform/*訊息結構*/

msg;

int msgqid,i;

void client()

exit(0);

"c/test3.c" 45l, 769c

msgsnd(msgqid,&msg,1024,0);/*傳送訊息msg入msgid訊息佇列*/

}exit(0);

}void server()

while(msg.mtype!=1);/*訊息型別為1時,釋放佇列*/

msgctl(msgqid,ipc_rmid,0);//delete signal

exit(0);

}main()

記錄結果

分析

message的傳送和控制並不保證完全同步,當乙個程式不再啟用狀態的時候,它完全可能繼續睡眠,造成上面現象,在多次sendmessage後才receivemessage.這一點有助於理解訊息轉送的實現機理。

訊息通訊的特點:訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。訊息的傳遞,自身就帶有同步的控制.當等到訊息的時候,程序進入睡眠狀態,不再消耗cpu資源。(摘自實驗指導書)

作業系統 實驗三(程序間通訊) 3 3 2

1 了解linux系統中程序通訊的基本原理。2 分析程序競爭資源現象,學習解決程序互斥的方法。編制一段程式,使用系統呼叫fork 建立兩個子程序,再用系統呼叫signal 讓父程序捕捉鍵盤上來的中斷訊號 即按ctrl c鍵 當捕捉到中斷訊號後,父程序用系統呼叫kill 向兩個子程序發出訊號,子程序捕...

作業系統 程序間通訊

程序間通訊涉及到3個問題 1.乙個程序如何把資訊傳遞給另乙個程序 2.確保兩個或多個程序之間不會在關鍵活動中出現交叉 3.程序間執行的順序對執行結果的影響。注意 確保程序對臨界區的 互斥 訪問。忙等待的互斥 1.遮蔽中斷 當乙個程序進入臨界區後立即遮蔽所有中斷,時鐘中斷也被遮蔽 這樣cpu就不會進行...

作業系統 程序間通訊

include include include include include include ifndef semun h 條件編譯,即若semun在標頭檔案中沒有被定義,就進行下面的編譯 define semun h union semun endif static int set semval...