Linux學習筆記(管道)

2021-09-28 16:11:30 字數 3246 閱讀 2823

管道是一種兩個程序見進行單向通訊的機制,因為管道只能對資料進行單向傳遞,所以管道又稱為半雙工管道。管道是linux由unix繼承而來的ipc形式之一。

管道分為無名管道與命名管道。

管道的特點:

1:只能在有親緣關係的程序之間進行通訊(也就是在父子程序之間通訊)

2:單向通訊乙個讀端,乙個寫端,如果要雙向通訊就要建立兩個管道

3:接收資料流,與資料格式無關

4:一般而言,程序退出,管道釋放,因此管道的生命週期隨程序

無名管道的缺點:

1、沒有名字,因此無法使用open()開啟

2、只能用於親緣程序間(如父子程序、兄弟程序、祖孫程序等)通訊

3、半雙工工作方式,讀寫端是分開的,pipefd[0]為讀端,pipefd[1]為寫端

4、寫入操作不具有原子性,因此只能用於一對一的簡單通訊

5、不能用lseek()來定位

管道命令的用法:

**注意:**管道命令只處理前乙個命令的正確輸出,並且管道命令的右邊命令,必須能夠接收標準輸入流命令才行。

案例1:

#include#include#include#include#include#includeint main()

//用fork建立乙個子程序

pid_t pid = fork();

if(-1 == pid)

if(pid == 0)

;//讀資料

read(pipefd[0],buffer,sizeof(buffer));

printf("%s\n",buffer);

exit(0);

}else if(pid > 0)

//關閉管道

close(pipefd[0]);

close(pipefd[1]);

return 0;

}

執行結果

案例2:

#include#include#include#includeint main()

pid = fork();

if (pid < 0)

else if (pid == 0)

//要寫入資料,則把管道讀取端關閉

close(pipefd[0]);

//將管道寫入端重定向到1,1本身代表標準輸出,重定向後指向管道

dup2(pipefd[1], 1);

close(pipefd[1]);

//ls結果本身輸出到螢幕上,重定向後寫入管道寫入端

相當一ls -l | wc命令

命名管道

建立命名管道shell命令: mkfifo 名稱

建立命名管道函式:

int mkfifo(const char *pathname, mode_t mode);

建立乙個命名管道檔案,通過管道檔案的資料寫入或者讀取來實現程序間的通訊

pathname 管道檔名稱

mode 管道檔案的建立許可權

mkfifo僅僅是建立乙個命名管道,如果要使用這個管道,那麼需要open開啟這個管道檔案

通過命令使用命名管道:

這時開啟另外乙個終端

敲下回車以後

此時會在第乙個終端裡也就是輸入cat my—namedpipe命令的終端裡輸出。

案例:

#include #include #include #include #include #include #include void test_func()

int main()

; int ret;

if (mkfifo(fifo_name, 0664) < 0)

} }fifo_fd = open(fifo_name, o_rdonly | o_nonblock);

while (1)

buff[ret - 1] = '\0';

if (!strcmp(buff, "function"))

printf("buf[%s]\n", buff);

} close(fifo_fd);

return 0;

}

該**主要功能就是,在乙個終端執行該程式,它會進入阻塞狀態等待管道test.fifo輸入資料,如果輸入的是function便調函式 test_func,如果不是便不會呼叫。

此時另開乙個終端並向test.fifo中輸入資料

由於我們輸入的並不是function,所以不會調函式。

這時輸入function便會呼叫test_fun函式。

Linux學習筆記之 管道

8 管道 8.1 無名管道 無名管道通常直接稱之為管道,它占用兩個檔案描述符,不能被非血緣關係 的程序共享,一般應用在父子程序中 8.2 無名管道的建立 include int pipe int fildes 2 函式pipe在核心中建立乙個管道,並分配兩個檔案描述符標識管道的兩端,這兩個檔案描述符...

Linux學習筆記 管道PIPE

管道 當從乙個程序連線資料流到另乙個程序時,使用術語管道 pipe include int pipe int filedes 2 建立管道 pipe 說明 返回值 0成功,1出錯。如果呼叫成功,則程序此時由了兩個額外的開啟檔案描述符,filedes 0 中的值是管道的讀取端,而filedes 1 是...

Linux 學習筆記15 管道

在 linux ipc 程序間通訊 中,管道通訊又有三種型別,分別為標準流管道,無名管道和有名管道。file popen const char command,const char open mode int pclose file fp 函式 popen 允許乙個程式將另乙個程式作為新程序來啟動,...