管道是一種兩個程序見進行單向通訊的機制,因為管道只能對資料進行單向傳遞,所以管道又稱為半雙工管道。管道是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 允許乙個程式將另乙個程式作為新程序來啟動,...