CentOS on Mac 3 程序通訊

2021-07-15 17:44:38 字數 1780 閱讀 2957

要求寫兩個程序a跟b

a:無限迴圈輸出乙個字元

b:入侵程序a,改變輸出的字元

#include 

#include

#include

int main()

while(1)

exit(0);

}

gcc -o process process.c

./process

ctrl+c 退出死迴圈

1.程序b可以破壞隔離性,修改程序a輸出的原因呼叫fork可以建立乙個全新的程序。

這個系統呼叫對當前程序進行複製。在程序表裡建立乙個新的專案,許多屬性與當前程序是相同的。新程序和原程序幾乎一模一樣,執行的也是相同的**,但新程序有自己的資料空間、自己的環境等。

程式呼叫了fork函式的時候被分成了兩個程序。在父程序裡,fork函式返回新程序的pid程序號,新程序則返回0,這個可以做為區分父子程序的依據。

2.程序通訊的作用(1)資料傳輸:乙個程序需要將它的資料傳送給另乙個程序

(2)共享資料:乙個程序對共享資料的修改,別的程序應該立刻看到。

(3)通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它(它們)發生了某種事件(如程序終止時要通知父程序)。

(4)資源共享:多個程序之間共享同樣的資源,需要核心提供鎖和同步機制。

(5)程序控制:有些程序希望完全控制另乙個程序的執行(如debug程序),此時控制程序希望能夠攔截另乙個程序的所有陷入和異常,並能夠及時知道它的狀態改變。

3.隔離性與通訊的平衡

作業系統中,程序間是相互不可見的。作業系統在邏輯上將每個程序隔離開了。乙個程序裡是不可能看到真實的物理記憶體位址的。記憶體位址,都是虛擬記憶體位址,而不是真實的物理記憶體位址。每個程序的虛擬記憶體位址都是一樣大的

程序間的記憶體相互隔絕,防止程序間的相互干擾。

假如a程序在操作乙個記憶體時,b程序無意中程式執行出錯,改寫了a的程序的記憶體,a程序就很可能崩潰,從而造成了破壞。這也是保護各個程序的安全的乙個手段。同時,作業系統也是有各種程序組成的。

系統的程序同樣也會被其他程序進行破壞,既保護了使用者程式安全,更是保護了作業系統本身,使作業系統變得很健壯。因為程式的操作都是在自己的虛擬位址空間中執行的,系統內部在執行時,總是可以將虛擬記憶體位址對映到程序的實際的記憶體位址區間而不會越界,從而避免了記憶體破壞問題。

(1)將程序相互隔絕,才會出現各種各樣的通訊機制。

比如記憶體對映檔案,將乙個檔案開啟,作為通訊中介,然後將這檔案作為核心物件,分配乙個控制代碼,這個是公用的檔案,而這個控制代碼,是系統全部程序都可以看到的,並且看到的都是同乙個,然後通過向系統請求,得到訪問這個核心物件的控制代碼就可以操作了。操作完後,其他程序才可以操作,這個是「程序間的互斥」。而通過這種方式就可以更改公共的變數,達到通訊的目的。而這個通訊的過程就是記憶體對映檔案模式。核心檔案作為乙個中介,讓相互看不見的程序可以相互交換資料。

(2)管道,郵槽則也是通過訊息信件機制,通過系統投遞給程序的。

程序只要接受這個信件即可,然後了解情況後再傳送信件。系統成為了信使。這樣也達到通訊的機制。

這些也就解決了程序間相互不能通訊的問題,也保證程序間相互隔絕後的安全。

Python 多程序程序池Queue程序通訊

from multiprocessing import pool,manager import time defhanshu queue,a n 1 while n 50 print r正在工作 d a,end n 1 步驟3 往佇列中傳送一條訊息 queue.put a time.sleep 2 ...

MFC sendmessage實現程序間通訊

用sendmessage實現程序間通訊。實現方式是傳送wm copydata訊息。傳送程式 lresult copydataresult cwnd potherwnd cwnd findwindow null,卡口管理 cstring strdatatosend 0dae12a3d8c9425daa...

Android利用Binder實現程序通訊

注意 reply.writenoexception 這個方法,服務端如果寫了這個方法,客戶端獲取服務端訊息也必須要寫reply.readexception 這個方法。必須成對出現,否則獲取不到服務端的訊息。public ibinder onbind intent intent class mybin...