Linux 程序間通訊(管道)

2021-10-05 03:49:29 字數 2647 閱讀 7732

1、實現程序間通訊的原理:就像現實中管道的兩端一樣,由乙個程序進行寫操作,其餘的程序進行讀操作。如果管道為空,那麼read 會阻塞;如果管道為滿則 write 會阻塞

2、分類:管道可以分為有名管道和無名管道兩類。

3、區別

(1)有名管道:可以在任意程序之間進行通訊,通訊是雙向的,任意可讀可寫,但同一時間只能一端讀,一端寫。

4、管道的特點:

通訊方式:

全雙工:a可到b,b也可到a,如網路

半雙工:要麼a-->b,要麼b-->a,不可能同時存在

單路通訊:只能a-->b,如廣播)

一、有名管道

1、概念:有名管道是在磁碟有乙個管道檔案標識,但是這個管道檔案只會占用乙個inode結點,任何都不會佔據block塊,資料在傳遞過程中會快取到記憶體上

2、如何建立管道檔案???

命令:mkfifo filename     庫函式:int mkfifo();

3、操作:open  read  write  close

命令    mkfifo

函式    int  mkfifo(const char *pathname, mode_t  mode);

int  open(const char *pathname,  int flag);

int   write(int  fd,  void  *buff,   size_t  size);

int   read(int fd,  void  *buff,  size_t  buff_len);

int   close(int  fd);

maina.c  

#include #include #include #include #include #include int main()

; printf("input: ");

fgets(buff,127,stdin);

if(strncmp(buff,"end", 3)==0)

write(fd,buff, strlen(buff) -1);

} close(fd);

}

mainb.c 

#include #include #include #include #include #include int main()

; int n = read(fd,buff,127);

if(n <= 0)

printf("read: %s\n",buff);

} close(fd);

}

只執行a或b都會發生阻塞,只有a,b都發生時才成功執行

注:buff是用於存放要輸出到塊儲存的資料清除緩衝的方法----緩衝區快取

ulimit -a:檢視所有檔案大小

3、核心對管道的記憶體空間管理是以迴圈的方式

有名管道操作注意:

二、無名管道1、概念:沒有管道檔案, 借助父子程序共享fork之前開啟的檔案描述符,來實現程序間通訊

2、特點:無名管道只能應用於父子程序之間(有名管道可以使用在任何程序之間)

3、操作:read  write  close

int   pipe(int   fds[2]);

建立成功後,fds[0] 指向管道的讀端    fds[1]指管道的寫端

Linux程序間通訊 管道

linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...

Linux程序間通訊 管道

管道 管道是一種最基本的程序間通訊機制,由pipe函式建立 include intpipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,f...

Linux 程序間通訊 管道

程序間通訊 a程序怎樣將 hello world 傳遞給b程序 i 利用檔案實現 需要乙個 中間人 進行傳遞 檔案 在磁碟中儲存 a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下 1.如果a傳送了資料b進行了接收,但a的資料沒有被清空 2.如果a傳送了資料...