Linux程序通訊

2021-04-13 23:21:37 字數 2908 閱讀 5318

linux程序通訊

無名管道主要用於有親緣關係的程序通訊,其位於外存區域,但在檔案系統中不可見。在實際應用中,程序通訊往往發生在無關程序之間,此種情形下,若仍想使用管道,則必須使用有名管道,也稱命名管道或fifo檔案。這種型別的管道在檔案系統中可見,建立時需要指定具體路徑和檔名,管道建立之後,可用ls命令檢視。

在終端中命令列中建立有名管道的方法是使用mkfifo命令,如在/tmp目錄下建立名為fifoname的有名管道檔案,執行下面命令,該命令完成後,可轉到相應路徑下使用ls命令檢視:

# mkfifo /tmp/fifoname

呵呵,fifo建立好了,我們就可以嘗試使用了。首先,建立兩個讀寫程序,其中乙個放在後台執行。

# echo "hello, fifo!" > /tmp/fifoname &

該命令顯示的結果為

[1] 6242

該結果中的6242為後台執行程序的pid號,該數值不一定,根據系統分配的pid號會有相應的值。

然後,建立讀取程序,讀取寫入程序所寫入的資訊。

# cat < /tmp/fifoname

該命令顯示的結果為

hello, fifo!

[1]+ done                    echo "hello, fifo!" >/tmp/fifoname

說明兩個程序已同時完成各自的工作。

從上面的例子可以看出,fifo完成了程序通訊任務,而且讀寫兩程序是同時完成工作的。作業系統理論指出,對共享區域的操作需要有互斥機制,這種互斥機制在linux fifo操作中的具體表現就是操作程序的阻塞。上面的例子中,寫程序的操作被放在了後台,所以無法看到阻塞的直接效果,而是輸出了乙個後台執行的程序號就被阻塞在了後台,直到讀程序開始操作時,fifo中的資料被傳遞給讀程序並顯示出來,同時,寫程序解除阻塞,同時結束。若想看到阻塞的直接效果,只需要在建立寫程序時,不將其放在後台即可,此時的現象為命令列呈現假死機,即程序阻塞狀態。

根據例子進行歸納後不難得出結論,只有fifo兩端都有程序工作時,程序才不會阻塞,否則,一端的程序一定會阻塞等待,直至另一程序前來進行操作。

在程式中使用有名管道時,需要用mkfifo系統呼叫建立fifo檔案,其函式原型為:

int mkfifo(const char *filename, mode_t mode)

該系統呼叫的功能是建立名為filename的fifo檔案,該檔案具有mode訪問模式,該mode為一**,與chmod命令中指定的mode**含義相同。

fifo檔案建立完成後,要使用open系統呼叫開啟該檔案方可使用,open函式原型為:

int open(const char *path, int oflags)

其中,path引數指定檔案的具體路徑和檔名,oflags引數指定了開啟方式,傳統開啟方式有o_rdonly、o_wronly和o_rdwr三種,而對於fifo檔案來說,o_rdwr方式不可用,因此,若想實現程序之間的雙向通訊,需要使用兩條管道,即建立兩個fifo檔案方可進行。此外,還有另外乙個輔助的o_nonblock標誌常量,使用時與o_rdonly或o_wronly進行邏輯或運算後作為oflags引數值,若使用該標誌,則將以非阻塞方式開啟,否則,預設為使用阻塞方式開啟。

fifo檔案開啟後,就可以使用read/write系統呼叫進行讀寫了,可以看出,fifo檔案將程序間通訊對映為對檔案的讀寫。read/write系統呼叫的函式原型如下:

size_t read(int fildes, const void *buf, size_t nbytes)

size_t write(int fildes, const void *buf, size_t nbytes)

這兩個函式的返回值是程序之間傳輸的位元組數,引數fildes為檔案描述符,buf為通訊緩衝區,nbytes為需要傳輸的位元組數。這兩個函式的功能為將buf中的前nbytes資料讀出/寫入fildes檔案描述符所指代的檔案進行通訊互動。fifo使用完畢後,要使用close系統呼叫關閉fifo檔案通訊,使用unlink系統呼叫刪除fifo檔案。

下面給出乙個有意義的例子,使用有名管道(fifo檔案)實現乙個程序間通訊的模板類。

// fifocommunication.h

#ifndef fifo_communication_h_

#define fifo_communication_h_

#include

#include

#include

#include

#include

#include

#include

#include

#include

enum fiforesult ;

const fifo_name_max_length = 256;

template

class fifocommunication

;

#endif

// fifocommunication.cpp

#include "fifocommunication.h"

template

fifocommunication::fifocommunication(char *fiforead, char *fifowrite)

template

fiforesult fifocommunication::read(message_type *msgbuffer, int nbuffersize, int *pbytestransport)

else

else

}

}

template

fiforesult fifocommunication::write(message_type *msgdata, int nmessagesize, int *pbytestransport)

else

else

}

}

Linux 程序通訊

程序通訊 通訊 communication 意味著在程序間傳送資料。也把程序間控制資訊的交換稱為低階通訊,而把程序間大批量資料的交換稱為高階通訊。程序通訊的型別 1 共享儲存器系統 記憶體 共享儲存器系統為了傳送大量資料,在儲存器中劃出一塊共享儲存區,諸程序可通過對共享儲存區進行讀資料或寫資料以實現...

Linux 程序通訊

linux下程序通訊的八種方法 管道 pipe 命名管道 fifo 共享記憶體 shared memory 訊息佇列 message queue 訊號量 semaphore 訊號 signal 套接字 socket linux命令中,執行乙個程式,後面加上 代表後台執行,也就是執行這個程式的同時,你...

Linux程序通訊

lniux程序間通訊 目的 1.資料傳輸 乙個程序需要將他的資料傳送給另乙個程序 2.資源共享 多個程序之間共享同樣的資源 3.通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知他們發生了某種事件 4.程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望攔截另乙個程...