作業系統大作業 程序間通訊

2021-10-07 16:42:42 字數 3263 閱讀 7356

目的:了解程序間通訊的機制,實現程序的兩種通訊方式,多次執行,觀察結果,並對兩種通訊方式進行比較。

內容:利用系統提供的通訊系統呼叫,進行一種方式的程序通訊的程式設計,並對結果進行分析,同時了解另一種通訊方式,將兩種方式進行比較分析。

(1)訊息的建立傳送和接收

使用系統呼叫msgget()、msgsnd()、msgrev()、msgctl()來編寫長度為500位元組的傳送和接收程式。用乙個程式先後建立兩個子程序server和client,進行訊息佇列方式通訊。由server建立訊息佇列,等待其他程序發來訊息,當遇到型別為1的訊息,則作為通訊結束的訊號,取消訊息佇列,退出。server每接收到乙個訊息顯示在螢幕上。

client判斷乙個資料中的整數是否為素數,然後使用server建立的訊息佇列,將某數是否為素數的訊息依次傳送給server,然後退出。client每次傳送時把訊息顯示在螢幕上。

(2)共享儲存區的建立,附接和斷接

使用系統呼叫shmget(),shmat(),shmctl()編寫乙個與上面(1)中相同功能的程式。

(說明:以上函式是linux系統下,如果windows系統下實現也可以,將函式換為windows下相關函式即可)

報告要求:

(1)仔細觀察設計中的各種現象及出現的問題。分析產生各種現象的原因。尋找解決問題的辦法。

(2)報告應至少包括帶注釋的程式清單、輸出的結果及對各種現象的分析意見。

#include

#include

#include

#include

#include

#include

#include

#include

#define max_text 500

struct msg_st

;void

isprm

(char nums,

int n)

}else

else}}

}void

msgreceive()

while(1

)printf

("you wrote:%s\n"

, data.text)

;isprm

(data.text, max_text);if

(strncmp

(data.text,

"1",1)

==0&&(

strlen

(data.text)-1

)==1)

}if(msgctl

(msgid, ipc_rmid,0)

==-1)

exit

(exit_success);}

void

msgsend()

while(1

)if(strncmp

(buffer,

"1",1)

==0&&(

strlen

(buffer)-1

)==1)

sleep(1

);}}

intmain

(int argc,

char

**ar**)

if(pid==

0&&i==1)

if(pid==-1

)}if(i==0)

else

if(i==1)

else

if(i==2)

return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#define text_sz 500

struct shared_use_st

;void

isprm

(char nums,

int n)

}else

else}}

}void

shmread()

shm =

shmat

(shmid,0,

0);if

(shm ==

(void*)

-1)printf

("\nmemory attached at %x\n",(

int)shm)

; shared =

(struct shared_use_at*

)shm;

shared->written =0;

while(1

)}else}if

(shmdt

(shm)==-

1)if(

shmctl

(shmid,ipc_rmid,0)

==-1)

exit

(exit_success);}

void

shmwrite()

shm =

shmat

(shmid,

(void*)

0,0)

;if(shm ==

(void*)

-1)printf

("memory attched at %x\n",(

int)shm)

; shared =

(struct shared_use_st *

)shm;

while(1

)printf

("enter some text:");

fgets

(buffer,bufsiz,

stdin);

strncpy

(shared->text,buffer,text_sz)

; shared->written =1;

if(strncmp

(buffer,

"1",1)

==0&&(

strlen

(buffer)-1

)==1)

}if(shmdt

(shm)==-

1)sleep(1

);exit

(exit_success);}

intmain()

if(pid==

0&&i==1)

if(pid==-1

)}if(i==0)

else

if(i==1)

else

if(i==2)

return0;

}

作業系統 程序間通訊

程序間通訊涉及到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...

作業系統 程序間通訊

程序間通訊方式總結 優缺點 linus下的程序通訊手段基本上是從unix平台上的程序通訊手段繼承而來的。1 無名管道通訊 半雙工通訊,只能在具有親緣關係的程序間使用 1 管道 2 高階管道通訊 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子 程序 3 有名管道通訊 半雙工通訊...