Linux 程序間通訊 管道通訊

2021-06-12 22:18:25 字數 2384 閱讀 2984

管道是 單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起,

乙個程序( 寫程序 ) 在管道的尾部寫入資料,另乙個程序 (讀程序 )從管道的頭部讀出資料 .

資料被乙個程序讀出之後,將被從管道中刪除,其它讀程序將不能再讀到這些資料,管道提供了

簡單的流控制機制,程序試圖讀空管道時,程序將阻塞,同樣,管道已經滿時,

程序再試圖向管道寫入資料,程序將阻塞.

管道包括:有名管道 和無名管道.

無名管道 用於父程序 和 子程序 間的通訊.

有名管道 用於執行於同一系統中的任意兩個程序間的通訊.

無名管道由 pipe() 函式建立: int  pipe ( int  filedis[2] );

當乙個管道建立時,它會建立兩個檔案描述符:fileis[0] 用於讀管道,filedis[1] 用於寫管道.

eg:管道在核心空間建立,使用者空間   fileis[0] ,filedis[1] ,

filedis[1]在管道的尾寫入資料,

fileis[0] 在管道的頭部讀出資料.

關閉管道只需要將這兩個檔案描述符關閉即可,

可使用普通的 close 函式 逐個關閉 .

eg:close ( fileis [0] );

管道用於不同程序間通訊,通常先建立乙個管道,再通過 fork 函式建立乙個子程序,

該子程序會繼承父程序所建立的管道.

注意事項:

必須在系統呼叫 fork() 函式前呼叫 pipe() ,否則子程序將不會繼承檔案描述符 ( fork 子程序拷貝 ).

下面這個例子:

#include #include #include #include #include int main()

/*建立子程序*/

if((pid=fork())==0) //子程序

close(pipe_fd[0]);

exit(0);

}else if(pid>0)

return 0;

}

父程序寫操作,子程序讀操作.

命名管道 和 無名管道基本相同,但也有不同點:無名管道只能由父子程序使用,

但是通過命名管道,不相關的程序也能交換資料.

函式:int  mkfifo ( const char *pathname , mode_t  mode ).

pathname :fifo檔名.

mode :屬性 ( 見檔案操作章節 ) 一旦建立了乙個 fifo ,就可用 open 開啟它,一般的檔案訪問函式

( close,read,write等 )都可用於fifo.

當開啟 fifo 時候,非阻塞標準( o_nonblock ) ,

將對以後的讀寫產生如下影響:

1,沒有使用  o_nonblock:訪問要求無法滿足時程序將阻塞,如試圖讀取空的 fifo,

將導致程序阻塞.

2,使用 o_nonblock:訪問要求無法滿足時不阻塞,立刻出錯返回, errno 是 enxio .

下面是命名管道的操作的兩個檔案:

fifo_read.c 讀檔案:

#include #include #include #include #include #include #include #define fifo "/tmp/myfifo"

main(int argc,char** argv)

while(1)

printf("read %s from fifo\n",buf_r);

sleep(1);

} pause(); /*暫停,等待訊號*/

unlink(fifo); //刪除檔案

}

fifo_write.c 寫檔案:

#include #include #include #include #include #include #include #define fifo_server "/tmp/myfifo"

main(int argc,char** argv)

strcpy(w_buf,argv[1]);

/* 向管道寫入資料 */

if((nwrite=write(fd,w_buf,100))==-1)

else

printf("write %s to the fifo\n",w_buf);

}

對這命名管道操作應注意:

先在乙個終端執行 read 檔案,再在另乙個終端下執行 write 檔案,否則將讀不到資料.

原因:命名管道建立在 read 中 ,如果在沒建立的情況下去寫管道的話,那是不可以的.

然後就是保證兩個檔案操作的是同乙個檔案  #define fifo_server "/tmp/myfifo" .

Linux程序間通訊 管道通訊

1.管道簡介 管道是linux中程序間通訊的一種方式,它把乙個程式的輸出直接連線到另乙個程式的輸入。管道主要包括兩種 無名管道和有名管道 無名管道 有名管道 linux中管道通訊的一種原始方法 對無名管道的一種改進 只能用於具有親緣關係的程序之間通訊 可以使互不相關的兩個程序實現彼此通訊 單工的通訊...

Linux程序間通訊 管道

linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...

Linux程序間通訊 管道

管道 管道是一種最基本的程序間通訊機制,由pipe函式建立 include intpipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,f...