1. 程式人生 > >程序間通訊之管道通訊(PIPE匿名管道)

程序間通訊之管道通訊(PIPE匿名管道)

#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訊號,預設寫不進會終止程序。

注意 讀端未讀管道資料滿,寫段再寫會阻塞。

原創。如有錯漏歡迎指正。