? ? ? linux環境下,各進程相互獨立,如果想要交換兩個進程之間的數據,需要通過內核,在內存中提供一個緩存區,一個進程往緩存區中寫數據,一個往緩存區讀數據,內核提供的這種機制稱為進程間通信(IPC),常見的進程通信有四種:管道(最簡單),信號(開銷最小),共享映射區(無血緣關系),本地套接字(最穩定)。
? ? ? (1)管道
? ? ?管道的特點:本質是一個偽文件(內核緩沖區),兩個文件描述符引用(讀端和寫端),寫端寫入,讀端讀出。
? ? ?管道的原理及實質:內核使用環形隊列機制,借助內核緩沖區實現。
? ? ?管道的缺點:1)數據自己讀不能自己寫;2)數據被讀走,不在管道存在;3)半雙工通信(數據讀寫不能同時,數據流向唯一);4)有血緣關系的進程間;
? ? ?創建管道pipe函數:
? ? ?函數頭文件及原型:函數參數為輸入參數? ? ? ?成功調用返回0 ,失敗返回-1
? ?
? 函數調用成功返回r/w兩個文件,無需open,但是需要手動close,其中pipefd[0] -->r,pipefd[1]-->w,可根據讀寫要求關閉pipe的一端來實現進程通信;
? 管道中的讀寫情況有四種:
? ? ?1)讀管道時? ? 1.管道有數據,read返回實際讀到的字節數;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.管道中無數據
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1>管道寫端全部關閉,read返回0,表示讀到文件末尾;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2>官渡寫端沒有關閉,read阻塞等待數據來;
? ?2)寫管道時? ? ? 1.管道讀端全部關閉,進程異常終止
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.管道讀端沒有關閉
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1>管道已滿,write阻塞
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2>管道未滿,write寫入數據,返回實際寫入的字節數。
使用管道實現父子通信,實現ls |wc -l? ,父進程實現ls.子進程實現wc -l;
使用管道實現兄弟進程通信,兄:ls? 弟? wc -l? 父 等待回收子進程
(2)FIFO? ?命名管道(不想關的進程也可以進行通信)
?特點:屬于基礎文件類型的一種,FIFO文件在磁盤上沒有數據塊,只有用來表示內核的一條通道,各進程可以打開這個文件進行read/write。
創建方式:命令? mkfifo 管道名
? ? ? ? ? ? ? ? ? ?庫函數 int mkfifo(const char*pathname,mode_t mode);? 成功:0 失敗 -1;
使用mkfifo創建了一個FIFO,就可以用open打開它,常見的i/o函數都可以作用于fifo.
如博客https://blog.csdn.net/superywf/article/details/73438465的例子使用如下: