程序間通訊之管道通訊(PIPE匿名管道)
阿新 • • 發佈:2018-12-31
#include<stdio.h> #include<errno.h> #include<fcntl.h> #include<unistd.h> #include<stdlib.h> #include<string.h> int main() { char cwrite[1024]; char cread[1024]; int fd[2]; if(pipe(fd)) { perror("pipe"); exit(errno); } int pid = fork(); if(pid>0) { close(fd[0]); //關閉讀管道 sprintf(cwrite,"hello world!!\n"); write(fd[1],cwrite,strlen(cwrite)); wait(NULL); } else if(0 == pid) { close(fd[1]); //關閉寫管道 int len = read(fd[0],cread,sizeof(cread)); write(STDOUT_FILENO,cread,len); } return 0; }
pipe管道通訊只適用於有血緣關係的程序間通訊,不同程序間的通訊不適適用匿名的管道通訊
pipe管道位於核心空間塊,預設大小是64k 可以使用fpathconf(fd[1],_PC_PIPE_BUF)檢視
pipe通訊預設是阻塞IO的 若要適用非阻塞的 pipe 可以使用
int flags |= O_NONBLOCK;
fcntl(fd[1], F_SETFL, flags) 使檔案變為非阻塞讀
pipe程序通訊為單向通訊,若要雙向通訊可以通過在開闢一條管道進行通訊。
注意 fd[2]中fd[0]一般情況為3 用作讀管道檔案描述符,fd[1]一般是4為用作寫管道描述符。
注意 若讀端關閉,則寫端寫管道會產生SIGPIPE訊號,預設寫不進會終止程序。
注意 讀端未讀管道資料滿,寫段再寫會阻塞。
原創。如有錯漏歡迎指正。