程序通訊 管道建立

2022-07-05 17:12:12 字數 2468 閱讀 3313

管道通訊

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

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

管道包括無名管道和有名管道。前者用於父程序和子程序間的通訊,後者可用於執行於同一系統的任意兩個程序間的通訊。

無名管道

無名管道由pipe()函式建立

int pipe(int fd[2]);//建立管道,為系統呼叫:unistd.h

建立成功返回0,失敗返回-1

建立兩個檔案描述符:fd[0]用於讀管道,fd[1]用於寫管道

注意:管道是建立在記憶體中的,程序結束,空間釋放,管道就不存在了

管道中的東西,讀完了就刪除了

如果管道沒有東西可讀,就會讀堵塞

關閉管道,close關閉兩個檔案描述符

必須在系統呼叫fork()前呼叫pipe(),否則子程序將不會繼承檔案描述符(子父各建立了乙個管道)

無名管道源**

#include #include

#include

#include

#include

#include

#include

#include

intmain()

else

fd1 =fork();

if (fd1 == 0)//

子程序

if (fd1 > 0)//

父程序

return0;

}

有名管道1、建立這個檔案節點,不可以通過open函式,open函式只能建立普通檔案,不能建立特殊檔案(管道-mkdifo,套接字-socket,字元裝置檔案-mknod,塊裝置檔案-mknod,符號鏈結檔案-ln-s,目錄檔案 mkdir)

2、管道檔案只有inode號,不佔磁碟塊空間,和套接字、字元裝置檔案、塊裝置檔案一樣。普通檔案和符號鏈結檔案及目錄檔案,不僅有inode號,還佔磁碟塊空間

3、mkfifo 用來建立管道檔案的節點,沒有在核心中建立管道

只有通過open函式開啟這個檔案時才會在核心空間建立管道

mkfifo

函式形式 :int mkfifo(const char *filename,mode_t mode);

功能:建立管道檔案

引數:管道檔案檔名,許可權,建立的檔案許可權仍然和umask有有關係

返回值:建立成功返回0,建立失敗返回-1

**如下,建立3個.c檔案

//

建立管道節點 1.c

#include #include

#include

#include

#include

#include

#include

#include

intmain()

else

printf(

"建立管道節點成功");

}

//

建立乙個程序寫管道 write.c

#include #include

#include

#include

#include

#include

#include

#include

intmain()

else

write(fd,a,

sizeof

(a));

printf(

"已傳送資料到管道\n");

}

//

建立乙個程序讀管道 read.c

#include #include

#include

#include

#include

#include

#include

#include

intmain()

else

read(fd,b,

sizeof

(b));

printf(

"接收資料成功:%s\n

",b);

close(fd);

}

結果如下

程序通訊 管道通訊

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

程序通訊 管道通訊

自己的理解,首先要區分概念 管道和管道通訊 所謂 管道 是指用於連線乙個讀程序和乙個寫程序以實現它們之間通訊的乙個共享檔案,又名pipe檔案 是一種特殊的檔案,這就意味著你可以向操作檔案一樣操作無名管道,無名管道在核心中對應的是一段特殊的記憶體空間,這段記憶體空間由作業系統進行管理,對使用者是不可見...

linux 程序通訊 管道通訊

程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...