訊息的建立傳送和接收

2021-04-14 19:24:40 字數 2700 閱讀 1549

作業系統

訊息部分的比較經典的問題之一就是「訊息的建立傳送和接收」對於該問題完成並不難,我們使用訊息呼叫msgget msgsnd msggrev msgctrl 編制長度為1k 的訊息的傳送和接收程式,從而完成我們的問題。

在作業系統訊息部分的比較經典的問題之一就是「訊息的建立傳送和接收」對於該問題完成並不難,我們使用訊息呼叫msgget msgsnd msggrev msgctrl 編制長度為1k 的訊息的傳送和接收程式,從而完成我們的問題。我的開發環境選擇的是red hat

linux

程式**如下:

#include

#include

#include

#include

#define msgkey 75

struct msgform

msg;

int msgqid,i;

void client()

exit(0);

} void server()

while(msg.mytype!=1);

msgct1(msgqid,ipc_rmid,0);

exit(0);

} void main()

誤將位置一的server(),誤打成server;

預計輸出:

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

即是:10個同樣的輸出

實際輸出:

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

(client)sent

即是:20個同樣的輸出

錯誤估計:

依據一:

理論上說,server後無括號應不進行任何操作,理由經下面實驗測試得出

實驗**:

#include

void f1()

void f2()

void main()

輸出結果:f2 received,也就是說,f1;不起任何作用。

但本例卻多輸出了10個(client)sent,即client()執行了2次。我們估計是由於linux系統本身的保護機制所致,因為此程式執行時client端和server端都必須有效,但由於建立

server端的**無效,即無server.因此client向server發訊息時將導致錯誤,系統有權對每個程序進行監聽,

因此系統很可能對出錯點以後進行**,即server後的**執行了兩次,才導致的上述結果.

依據二:

若在第二個wait(0)後(程式最後一行),加入printf("server closed/n"),則輸出兩個"server closed",理論上說,程式的最後一行程式,若無任何迴圈,應該只執行一次,但這裡輸出了兩個,所以應該不是程式本身造成的,有可能是外部程序的影響(作業系統).

對於我們的設想,並沒有得到專家的認可,為此,我們請教了我校計算機

學院高紅雨老師,實際上問題是這樣的:

理想情況是: 父程序建立第乙個子程序, 然後父程序建立第二個子程序;第乙個子程序執行server(), 執行完該函式之前, 呼叫了exit(), 整個程序結束,並沒有返回main(); 第二個子程序執行client(), 執行完該函式之前, 呼叫了exit(), 整個程序結束, 並沒有返回main().

錯誤的情況是: 父程序建立第乙個子程序, 然後父程序建立第二個子進

程; 第乙個子程序並沒有執行server(), 因此不會呼叫其中的exit()使第乙個程序

結束, 而是繼續執行main()中後面的語句:

while ( ( i = fork() ) != 0 )

; if ( !i )

client();

wait(0);

wait(0);

也就是說, 第乙個子程序又建立了乙個子程序, 這個程序執行了client()函式, 打

印了10個"(client)sent"; 第二個子程序執行client(), 列印了10個

"(client)sent", 執行完該函式之前, 呼叫了exit(), 整個程序結束, 並沒有返回

main().

這個問題本來是我在學習作業系統的時候遇到的乙個問題,思考了很長時間,還是覺得很有價值,所以整理成文章,希望能夠對大家學習這方面的內容提供一些幫助。問題雖然不複雜,但是如果不認真地分析,是很難得出正確結論的。 

kafka 訊息傳送和接收

傳送 例項 public class kafkaproducerdemo extends thread override public void run else catch interruptedexception e catch executionexception e num try catc...

串列埠傳送和接收訊息

stm32f4開發板搭載乙個usb串列埠,2個rs232串列埠,部落格內容介紹usb串列埠和電腦通訊 步驟 1 串列埠和io口使能 rcc apb2periphclockcmd rcc apb2periph usart1,enable rcc ahb1periphclockcmd rcc ahb1p...

通過kafka傳送和接收訊息

生產者配置類 configuration enablekafka public class kafkaproducerconfig private string address value private string batchsize value private string linger pu...