在
作業系統
訊息部分的比較經典的問題之一就是「訊息的建立傳送和接收」對於該問題完成並不難,我們使用訊息呼叫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...