study linux 程序通訊之管道

2021-08-07 13:33:38 字數 4331 閱讀 5088

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 ...