1. 程式人生 > >Linux環境程序間通訊(二): 訊號(上)(轉)

Linux環境程序間通訊(二): 訊號(上)(轉)

訊號本質

訊號是在軟體層次上對中斷機制的一種模擬,在原理上,一個程序收到一個訊號與處理器收到一箇中斷請求可以說是一樣的。訊號是非同步的,一個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。

訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些事情發生了。訊號機制經過POSIX實時擴充套件後,功能更加強大,除了基本通知功能外,還可以傳遞附加資訊。

訊號來源

訊號事件的發生有兩個來源:硬體來源(比如我們按下了鍵盤或者其它硬體故障);軟體來源,最常用傳送訊號的系統函式是kill, raise, alarm和setitimer以及sigqueue函式,軟體來源還包括一些非法運算等操作。

可以從兩個不同的分類角度對訊號進行分類:(1)可靠性方面:可靠訊號與不可靠訊號;(2)與時間的關係上:實時訊號與非實時訊號。在《Linux環境程序間通訊(一):管道及有名管道》的附1中列出了系統所支援的所有訊號。

"不可靠訊號"

Linux訊號機制基本上是從Unix系統中繼承過來的。早期Unix系統中的訊號機制比較簡單和原始,後來在實踐中暴露出一些問題, 因此,把那些建立在早期機制上的訊號叫做"不可靠訊號",訊號值小於SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的訊號都是不可靠訊號。這就是"不可靠訊號"的來源。它的主要問題是:

  • 程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理;因此,使用者如果不希望這樣的操作,那麼就要在訊號處理函式結尾再一次呼叫signal(),重新安裝該訊號。
  • 訊號可能丟失,後面將對此詳細闡述。 
    因此,早期unix下的不可靠訊號主要指的是程序可能對訊號做出錯誤的反應以及訊號可能丟失。

Linux支援不可靠訊號,但是對不可靠訊號機制做了改進:在呼叫完訊號處理函式後,不必重新呼叫該訊號的安裝函式(訊號安裝函式是在可靠機制上的實現)。因此,Linux下的不可靠訊號問題主要指的是訊號可能丟失。

"可靠訊號"

隨著時間的發展,實踐證明了有必要對訊號的原始機制加以改進和擴充。所以,後來出現的各種Unix版本分別在這方面進行了研究,力圖實 現"可靠訊號"。由於原來定義的訊號已有許多應用,不好再做改動,最終只好又新增加了一些訊號,並在一開始就把它們定義為可靠訊號,這些訊號支援排隊,不 會丟失。同時,訊號的傳送和安裝也出現了新版本:訊號傳送函式sigqueue()及訊號安裝函式sigaction()。POSIX.4對可靠訊號機制 做了標準化。但是,POSIX只對可靠訊號機制應具有的功能以及訊號機制的對外介面做了標準化,對訊號機制的實現沒有作具體的規定。

訊號值位於SIGRTMIN和SIGRTMAX之間的訊號都是可靠訊號,可靠訊號克服了訊號可能丟失的問題。Linux在支援新版本的 訊號安裝函式sigation()以及訊號傳送函式sigqueue()的同時,仍然支援早期的signal()訊號安裝函式,支援訊號傳送函式 kill()。

注:不要有這樣的誤解:由sigqueue()傳送、sigaction安裝的訊號就是可靠的。事實上,可靠訊號是指後來新增的新訊號 (訊號值位於SIGRTMIN及SIGRTMAX之間);不可靠訊號是訊號值小於SIGRTMIN的訊號。訊號的可靠與不可靠只與訊號值有關,與訊號的發 送及安裝函式無關。目前linux中的signal()是通過sigation()函式實現的,因此,即使通過signal()安裝的訊號,在訊號處理函 數的結尾也不必再呼叫一次訊號安裝函式。同時,由signal()安裝的實時訊號支援排隊,同樣不會丟失。

對於目前linux的兩個訊號安裝函式:signal()及sigaction()來說,它們都不能把SIGRTMIN以前的訊號變成 可靠訊號(都不支援排隊,仍有可能丟失,仍然是不可靠訊號),而且對SIGRTMIN以後的訊號都支援排隊。這兩個函式的最大區別在於,經過 sigaction安裝的訊號都能傳遞資訊給訊號處理函式(對所有訊號這一點都成立),而經過signal安裝的訊號卻不能向訊號處理函式傳遞資訊。對於 訊號傳送函式來說也是一樣的。

早期Unix系統只定義了32種訊號,Ret hat7.2支援64種訊號,編號0-63(SIGRTMIN=31,SIGRTMAX=63),將來可能進一步增加,這需要得到核心的支援。前32種信 號已經有了預定義值,每個訊號有了確定的用途及含義,並且每種訊號都有各自的預設動作。如按鍵盤的CTRL ^C時,會產生SIGINT訊號,對該訊號的預設反應就是程序終止。後32個訊號表示實時訊號,等同於前面闡述的可靠訊號。這保證了傳送的多個實時訊號都 被接收。實時訊號是POSIX標準的一部分,可用於應用程序。

非實時訊號都不支援排隊,都是不可靠訊號;實時訊號都支援排隊,都是可靠訊號。

程序可以通過三種方式來響應一個訊號:(1)忽略訊號,即對訊號不做任何處理,其中,有兩個訊號不能忽略:SIGKILL及 SIGSTOP;(2)捕捉訊號。定義訊號處理函式,當訊號發生時,執行相應的處理函式;(3)執行預設操作,Linux對每種訊號都規定了預設操作,詳 細情況請參考[2]以及其它資料。注意,程序對實時訊號的預設反應是程序終止。

Linux究竟採用上述三種方式的哪一個來響應訊號,取決於傳遞給相應API函式的引數。

傳送訊號的主要函式有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

1、kill() 
#include <sys/types.h> 
#include <signal.h> 
int kill(pid_t pid,int signo) 

引數pid的值訊號的接收程序
pid>0程序ID為pid的程序
pid=0同一個程序組的程序
pid<0 pid!=-1程序組ID為 -pid的所有程序
pid=-1除傳送程序自身外,所有程序ID大於1的程序

Sinno是訊號值,當為0時(即空訊號),實際不傳送任何訊號,但照常進行錯誤檢查,因此,可用於檢查目標程序是否存在,以及當前進 程是否具有向目標傳送訊號的許可權(root許可權的程序可以向任何程序傳送訊號,非root許可權的程序只能向屬於同一個session或者同一個使用者的程序 傳送訊號)。

Kill()最常用於pid>0時的訊號傳送,呼叫成功返回 0; 否則,返回 -1。 注:對於pid<0時的情況,對於哪些程序將接受訊號,各種版本說法不一,其實很簡單,參閱核心原始碼kernal/signal.c即可,上表中的規則是參考red hat 7.2。

2、raise() 

  1. #include <signal.h>
  2. int raise(int signo)

向程序本身傳送訊號,引數為即將傳送的訊號值。呼叫成功返回 0;否則,返回 -1。

3、sigqueue() 

  1. #include <sys/types.h>
  2. #include <signal.h>
  3. int sigqueue(pid_t pid, int sig, const union sigval val)


呼叫成功返回 0;否則,返回 -1。

sigqueue()是比較新的傳送訊號系統呼叫,主要是針對實時訊號提出的(當然也支援前32種),支援訊號帶有引數,與函式sigaction()配合使用。

sigqueue的第一個引數是指定接收訊號的程序ID,第二個引數確定即將傳送的訊號,第三個引數是一個聯合資料結構union sigval,指定了訊號傳遞的引數,即通常所說的4位元組值。


  1. typedef union sigval {
  2.          int sival_int;
  3.          void *sival_ptr;
  4.      }sigval_t;

sigqueue()比kill()傳遞了更多的附加資訊,但sigqueue()只能向一個程序傳送訊號,而不能傳送訊號給一個程序 組。如果signo=0,將會執行錯誤檢查,但實際上不傳送任何訊號,0值訊號可用於檢查pid的有效性以及當前程序是否有許可權向目標程序傳送訊號。

在呼叫sigqueue時,sigval_t指定的資訊會拷貝到3引數訊號處理函式(3引數訊號處理函式指的是訊號處理函式由 sigaction安裝,並設定了sa_sigaction指標,稍後將闡述)的siginfo_t結構中,這樣訊號處理函式就可以處理這些資訊了。由於 sigqueue系統呼叫支援傳送帶引數訊號,所以比kill()系統呼叫的功能要靈活和強大得多。

注:sigqueue()傳送非實時訊號時,第三個引數包含的資訊仍然能夠傳遞給訊號處理函式; sigqueue()傳送非實時訊號時,仍然不支援排隊,即在訊號處理函式執行過程中到來的所有相同訊號,都被合併為一個訊號。

4、alarm() 

  1. #include <unistd.h>
  2. unsigned int alarm(unsigned int seconds)


專門為SIGALRM訊號而設,在指定的時間seconds秒後,將向程序本身傳送SIGALRM訊號,又稱為鬧鐘時間。程序呼叫alarm後,任何以前的alarm()呼叫都將無效。如果引數seconds為零,那麼程序內將不再包含任何鬧鐘時間。 
返回值,如果呼叫alarm()前,程序中已經設定了鬧鐘時間,則返回上一個鬧鐘時間的剩餘時間,否則返回0。

5、setitimer() 

  1. #include <sys/time.h>
  2. int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));


setitimer()比alarm功能強大,支援3種類型的定時器:

  • ITIMER_REAL: 設定絕對時間;經過指定的時間後,核心將傳送SIGALRM訊號給本程序;
  • ITIMER_VIRTUAL 設定程式執行時間;經過指定的時間後,核心將傳送SIGVTALRM訊號給本程序;
  • ITIMER_PROF 設定程序執行以及核心因本程序而消耗的時間和,經過指定的時間後,核心將傳送ITIMER_VIRTUAL訊號給本程序;

Setitimer()第一個引數which指定定時器型別(上面三種之一);第二個引數是結構itimerval的一個例項,結構itimerval形式見附錄1。第三個引數可不做處理。

Setitimer()呼叫成功返回0,否則返回-1。

6、abort() 

  1. #include <stdlib.h>
  2. void abort(void);

向程序傳送SIGABORT訊號,預設情況下程序會異常退出,當然可定義自己的訊號處理函式。即使SIGABORT被程序設定為阻塞訊號,呼叫abort()後,SIGABORT仍然能被程序接收。該函式無返回值。

如果程序要處理某一訊號,那麼就要在程序中安裝該訊號。安裝訊號主要用來確定訊號值及程序針對該訊號值的動作之間的對映關係,即程序將要處理哪個訊號;該訊號被傳遞給程序時,將執行何種操作。

linux主要有兩個函式實現訊號的安裝:signal()、sigaction()。其中signal()在可靠訊號系統呼叫的基礎 上實現, 是庫函式。它只有兩個引數,不支援訊號傳遞資訊,主要是用於前32種非實時訊號的安裝;而sigaction()是較新的函式(由兩個系統呼叫實 現:sys_signal以及sys_rt_sigaction),有三個引數,支援訊號傳遞資訊,主要用來與 sigqueue() 系統呼叫配合使用,當然,sigaction()同樣支援非實時訊號的安裝。sigaction()優於signal()主要體現在支援訊號帶有引數。

1、signal() 

  1. #include <signal.h>
  2. void (*signal(int signum, void (*handler))(int)))(int);


如果該函式原型不容易理解的話,可以參考下面的分解方式來理解: 

  1. typedef void (*sighandler_t)(int)
  2. sighandler_t signal(int signum, sighandler_t handler));


第一個引數指定訊號的值,第二個引數指定針對前面訊號值的處理,可以忽略該訊號(引數設為SIG_IGN);可以採用系統預設方式處理訊號(引數設為SIG_DFL);也可以自己實現處理方式(引數指定一個函式地址)。 
如果signal()呼叫成功,返回最後一次為安裝訊號signum而呼叫signal()時的handler值;失敗則返回SIG_ERR。

2、sigaction() 

  1. #include <signal.h>
  2. int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

sigaction函式用於改變程序接收到特定訊號後的行為。該函式的第一個引數為訊號的值,可以為除SIGKILL及SIGSTOP 外的任何一個特定有效的訊號(為這兩個訊號定義自己的處理函式,將導致訊號安裝錯誤)。第二個引數是指向結構sigaction的一個例項的指標,在結構 sigaction的例項中,指定了對特定訊號的處理,可以為空,程序會以預設方式對訊號處理;第三個引數oldact指向的物件用來儲存原來對相應訊號 的處理,可指定oldact為NULL。如果把第二、第三個引數都設為NULL,那麼該函式可用於檢查訊號的有效性。

第二個引數最為重要,其中包含了對指定訊號的處理、訊號所傳遞的資訊、訊號處理函式執行過程中應遮蔽掉哪些函式等等。

sigaction結構定義如下:


  1. struct sigaction {
  2.           union{
  3.             __sighandler_t _sa_handler;
  4.             void (*_sa_sigaction)(int,struct siginfo *, void *)
  5.             }_u
  6.                      sigset_t sa_mask;
  7.                     unsigned long sa_flags; 
  8.                   void (*sa_restorer)(void)
  9.                   }

其中,sa_restorer,已過時,POSIX不支援它,不應再被使用。

1、聯合資料結構中的兩個元素_sa_handler以及*_sa_sigaction指定訊號關聯函式,即使用者指定的訊號處理函式。除了可以是使用者自定義的處理函式外,還可以為SIG_DFL(採用預設的處理方式),也可以為SIG_IGN(忽略訊號)。

2、由_sa_handler指定的處理函式只有一個引數,即訊號值,所以訊號不能傳遞除訊號值之外的任何資訊;由 _sa_sigaction是指定的訊號處理函式帶有三個引數,是為實時訊號而設的(當然同樣支援非實時訊號),它指定一個3引數訊號處理函式。第一個參 數為訊號值,第三個引數沒有使用(posix沒有規範使用該引數的標準),第二個引數是指向siginfo_t結構的指標,結構中包含訊號攜帶的資料值, 引數所指向的結構如下:


  1. siginfo_t {
  2.                   int si_signo; /* 訊號值,對所有訊號有意義*/
  3.                   int si_errno; /* errno值,對所有訊號有意義*/
  4.                   int si_code; /* 訊號產生的原因,對所有訊號有意義*/
  5.         union{ /* 聯合資料結構,不同成員適應不同訊號 */ 
  6.           //確保分配足夠大的儲存空間
  7.           int _pad[SI_PAD_SIZE];
  8.           //對SIGKILL有意義的結構
  9.           struct{
  10.               ...
  11.               }...
  12.             ... ...
  13.             ... ... 
  14.           //對SIGILL, SIGFPE, SIGSEGV, SIGBUS有意義的結構
  15.               struct{
  16.               ...
  17.               }...
  18.             ... ...
  19.             }
  20.       }

注:為了更便於閱讀,在說明問題時常把該結構表示為附錄2所表示的形式。

siginfo_t結構中的聯合資料成員確保該結構適應所有的訊號,比如對於實時訊號來說,則實際採用下面的結構形式:


  1. typedef struct {
  2.         int si_signo;
  3.         int si_errno;            
  4.         int si_code;            
  5.         union sigval si_value;    
  6.         } siginfo_t;

結構的第四個域同樣為一個聯合資料結構:


  1. union sigval {
  2.         int sival_int;        
  3.         void *sival_ptr;    
  4.         }

採用聯合資料結構,說明siginfo_t結構中的si_value要麼持有一個4位元組的整數值,要麼持有一個指標,這就構成了與訊號 相關的資料。在訊號的處理函式中,包含這樣的訊號相關資料指標,但沒有規定具體如何對這些資料進行操作,操作方法應該由程式開發人員根據具體任務事先約 定。

前面在討論系統呼叫sigqueue傳送訊號時,sigqueue的第三個引數就是sigval聯合資料結構,當呼叫sigqueue 時,該資料結構中的資料就將拷貝到訊號處理函式的第二個引數中。這樣,在傳送訊號同時,就可以讓訊號傳遞一些附加資訊。訊號可以傳遞資訊對程式開發是非常 有意義的。

訊號引數的傳遞過程可圖示如下:


 

3、sa_mask指定在訊號處理程式執行過程中,哪些訊號應當被阻塞。預設情況下當前訊號本身被阻塞,防止訊號的巢狀傳送,除非指定SA_NODEFER或者SA_NOMASK標誌位。

注:請注意sa_mask指定的訊號阻塞的前提條件,是在由sigaction()安裝訊號的處理函式執行過程中由sa_mask指定的訊號才被阻塞。

4、sa_flags中包含了許多標誌位,包括剛剛提到的SA_NODEFER及SA_NOMASK標誌位。另一個比較重要的標誌位是 SA_SIGINFO,當設定了該標誌位時,表示訊號附帶的引數可以被傳遞到訊號處理函式中,因此,應該為sigaction結構中的 sa_sigaction指定處理函式,而不應該為sa_handler指定訊號處理函式,否則,設定該標誌變得毫無意義。即使為 sa_sigaction指定了訊號處理函式,如果不設定SA_SIGINFO,訊號處理函式同樣不能得到訊號傳遞過來的資料,在訊號處理函式中對這些信 息的訪問都將導致段錯誤(Segmentation fault)。

注:很多文獻在闡述該標誌位時都認為,如果設定了該標誌位,就必須定義三引數訊號處理函式。實際不是這樣的,驗證方法很簡單:自己實現 一個單一引數訊號處理函式,並在程式中設定該標誌位,可以察看程式的執行結果。實際上,可以把該標誌位看成訊號是否傳遞引數的開關,如果設定該位,則傳遞 引數;否則,不傳遞引數。

回頁首

訊號集被定義為一種資料型別:


相關推薦

Linux環境程序通訊: 訊號()

訊號本質訊號是在軟體層次上對中斷機制的一種模擬,在原理上,一個程序收到一個訊號與處理器收到一箇中斷請求可以說是一樣的。訊號是非同步的,一個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些事

Linux環境程序通訊: 訊號()

從訊號傳送到訊號處理函式的執行完畢對於一個完整的訊號生命週期(從訊號傳送到相應的處理函式執行完畢)來說,可以分為三個重要的階段,這三個階段由四個重要事件來刻畫:訊號誕生;訊號在程序中註冊完畢;訊號在程序中的登出完畢;訊號處理函式執行完畢。相鄰兩個事件的時間間隔構成訊號生命週期的一個階段。 下面闡述四個事件的實

Linux環境程序通訊: 共享記憶體()

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html, 作者:鄭彥興系統呼叫mmap()通過對映一個普通檔案實現共享記憶體。系統V則是通過對映特殊檔案系統shm中的檔案實現程序間的共享記憶體通訊。也就是說,每個共享記憶體區域對

Linux環境程序通訊: 共享記憶體()

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html, 作者:鄭彥興採用共享記憶體通訊的一個顯而易見的好處是效率高,因為程序可以直接讀寫記憶體,而不需要任何資料的拷貝。對於像管道和訊息佇列等通訊方式,則需要在內 核和使用者空間

Linux 環境程序通訊 套介面()

轉自https://www.ibm.com/developerworks/cn/linux/l-ipc/part6/, 作者:鄭彥興一個套介面可以看作是程序間通訊的端點(endpoint),每個套介面的名字都是唯一的(唯一的含義是不言而喻的),其他程序可以發現、連線並且 與之通訊。通訊域用來說明套介面通訊的協

Linux環境程序通訊 訊息佇列()

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/, 作者:鄭彥興訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然 POSIX 1003.1b在訊號的實時性方面作了

Linux環境程序通訊 訊號燈()

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/, 作者:鄭彥興訊號燈與其他程序間通訊方式不大相同,它主要提供對程序間共享資源訪問控制機制。相當於記憶體中的標誌,程序可以根據它判定是否能夠訪問某些共享資源,同時,程序也可以修改該標誌。除了用於訪

Linux環境程序通訊 管道及有名管道()

管道是Linux支援的最初Unix IPC形式之一,具有以下特點:管道是半雙工的,資料只能向一個方向流動;需要雙方通訊時,需要建立起兩個管道;只能用於父子程序或者兄弟程序之間(具有親緣關係的程序);單獨構成一種獨立的檔案系統:管道對於管道兩端的程序而言,就是一個檔案,但它不是普通的檔案,它不屬於某種檔案系統,

Linux環境程序通訊 訊號燈

一、訊號燈概述訊號燈與其他程序間通訊方式不大相同,它主要提供對程序間共享資源訪問控制機制。相當於記憶體中的標誌,程序可以根據它判定是否能夠訪問某些共享資源,同時,程序也可以修改該標誌。除了用於訪問控制外,還可用於程序同步。訊號燈有以下兩種型別:二值訊號燈:最簡單的訊號燈形式,

Linux環境程序通訊 共享記憶體

系統呼叫mmap()通過對映一個普通檔案實現共享記憶體。系統V則是通過對映特殊檔案系統shm中的檔案實現程序間的共享記憶體通訊。也就是說,每個共享記憶體區域對應特殊檔案系統shm中的一個檔案(這是通過shmid_kernel結構聯絡起來的),後面還將闡述。 1、系統V共

Linux環境程序通訊——共享記憶體

原文連結     原文連結:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 概述     Android系統中大量使用了mmap實現的共享記憶體,所以這裡需要介紹一下LInux程序間通訊

Linux環境程序通訊:共享記憶體

共享記憶體簡介 共享記憶體允許兩個或多個程序共享一給定的儲存區。因為資料不需要在客戶程序和伺服器程序之間複製,所以這是最快的一種IPC。共享記憶體的方式有兩種:mmap()系統呼叫和系統V共享記憶體。 mmap()系統呼叫 mmap()系統呼叫使得程序之間通過對映同一個普通

Linux程序通訊匿名管道命名管道共享記憶體,訊息佇列,訊號

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

Linux程序通訊IPC訊號量詳解與測試用例

學習環境centos6.5 Linux核心2.6 程序間通訊概述 1. 程序通訊機制 一般情況下,系統中執行著大量的程序,而每個程序之間並不是相互獨立的,有些程序之間經常需要互相傳遞訊息。但是每個程序在系統中都有自己的地址空間,作業系統通過頁表

Linux程序通訊IPC之訊息佇列詳解及測試用例

學習環境 Centos6.5 Linux 核心 2.6 什麼是訊息佇列? 訊息佇列是SystemV版本中三種程序通訊機制之一,另外兩種是訊號量和共享儲存段。訊息佇列提供了程序間傳送資料塊的方法,而且每個資料塊都有一個型別標識。訊息佇列是基於訊息的,而管

linux程序通訊--訊息佇列相關函式ftok詳解

ipc_perm中mode的含義 操作者 讀 寫 可讀可寫 使用者 0400 0200 0600 組 0040 0020 0060 其他 0004 0002 0006 5.  IPC物件的建立許可權     msgget、semget、sh

Linux程序通訊IPC之共享記憶體詳解與測試用例

學習環境centos6.5 Linux核心2.6 什麼是共享記憶體 共享記憶體允許兩個或更多程序訪問同一塊記憶體。當一個程序改變了這塊記憶體中的內容的的時候,其他程序都會察覺到這個更改。 效率: 因為所有程序共享同一塊記憶體,共享記憶體在各種程序

Linux程序通訊之管道通訊詳解

        在學習程序的時候,我們瞭解到了程序的獨立性:程序之間是相互獨立的,每個程序有自己的虛擬地址空間,並且虛擬地址空間通過頁表的對映,對映到屬於自己的實體記憶體上。並且各個程序之間互相不影響,執行自己的程式碼。    

Linux程序通訊方式 - UNIX Domain Socket

概述 Linux下程序通訊方式有很多,比較典型的有套接字,平時比較常用的套接字是基於TCP/IP協議的,適用於兩臺不同主機上兩個程序間通訊, 通訊之前需要指定IP地址. 但是如果同一臺主機上兩個程序間通訊用套接字,還需要指定ip地址,有點過於繁瑣. 這個時候就需要用到UNIX Domain Sock

Linux關於程序通訊共享記憶體

共享記憶體概念 共享記憶體允許兩個不相關的程序去訪問同一部分邏輯記憶體 如果需要在兩個執行中的程序之間傳輸資料,共享記憶體將是一種效率極高的解決方案 共享記憶體是由IPC為一個程序建立的一個特殊的地址範圍,它將出現在程序的地址空間中。 其他程序可以把同一段共享記憶體段“連