1.管道的本質:固定大小的核心緩衝區。
2.管道是半雙工的,資料只能乙個方向流動。
3.只有呼叫fork 父子程序才能管道通訊。
4.管道的讀寫規則
一.如果所有管道讀端對應的檔案描述符被關閉,則write操作會產生訊號sigpipe.
#include
#include
#include
#include
#include
void handler(int num)
}if(num == sigpipe)
}int main()
; pipe(pipefd);
signal(sigchld,handler);
signal(sigpipe,handler);
pid_t pid = fork();
if(pid <0)
if(pid == 0)
while(1)
count++;
}printf("cout is %d \n",count);
close(pipefd[1]);
exit(0);
}else
printf("father is break \n");
return
0;}
二.如果所有管道寫端對應的檔案描述符被關閉,則read返回0.
三.當管道不停的被寫,寫滿的時候
o_nonblock disable: write呼叫阻塞
o_nonblock enable:呼叫返回-1,errno值為eagain
以測試管道容量為例:
(f_getfl 開始寫成 f_getfld 結果是write一直阻塞狀態 無法退出哎)
void handler(int num)
}if(num == sigpipe)
}int main()
; int rett;
rett = pipe(pipefd);
if(rett == -1)
signal(sigchld,handler);
signal(sigpipe,handler);
pid_t pid = fork();
if(pid <0)
if(pid == 0)
while(1)
count++;
}printf("cout is %d \n",count);
close(pipefd[1]);
exit(0);
}else
if(pid >0)
printf("father is break \n");
return
0;}
5. 當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原子性。
當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。
#include
#include
#include
#include
#include
#include
#define num_k 68*1024
int main()
; memset(a,'a',sizeof(a));
memset(b,'b',sizeof(b));
int ret = pipe(fd);
pid_t pid = fork();
if(pid < 0)
if(pid == 0)
pid = fork();
if(pid == 0)
close(fd[1]);
sleep(2);
char buf_read[1024
*4] = ;
while(1)
執行結果如下:
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
son1 pid is
50649,ret:69632
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]a
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
son2 pid is
50650,ret:69632
pid id
50648,read buf[4095]b
pid id
50648,read buf[4095]b
ab交叉了。write不再是一次性全部寫入。管道容量可以測試:65536(我的)
6.最後 深入理解下管道
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(void )
pid = fork();
if (pid == -1)
if (pid == 0)
else
if (pid > 0 )
;close(pipefd[1]);
//複製檔案描述符pipefd[0],給標準輸入,言外之意:execlp的wc命令從管道中讀
dup2(pipefd[0], stdin_fileno);
close(pipefd[0]);
//len = read(pipefd[0], buf, 100);
execlp("wc", "wc", "-w", null);
printf("len:%d, buf:%s \n", len , buf);
//close(pipefd[0]);
}wait(null);
printf("parent ..quit\n");
return
0;}
用管道實現了 shell中管道ls | wc -l 程序通訊之管道通訊
管道通訊有乙個特點 通訊是半雙工的,即管道的一端只能讀或者只能寫 管道通訊可以分為 匿名管道通訊和命名管道通訊兩種 1.匿名管道通訊 適合用於父子程序間的通訊 include include include 匿名管道通訊,本機父子程序通訊方式 int main else waitpid pid,nu...
程序通訊之pipe通訊
管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 管道作用於有血緣關係的程序之間,通過fork來傳遞呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述...
程序通訊之管道通訊
管道概念 它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。分類 1.無名管道 用於父程序和子程序之間的通訊 2.命名管道 用於執行同一系統中的任意兩個程序間的通訊 無名管道 由pipe 函式建立 原型 int pipe ...