看了個教程,感覺還是要結合**看。
管道是linux裡面程序間通訊的一種方式,其他的還有像訊號(signal)、訊號量、訊息佇列、共享記憶體、套接字(socket)等。
1.管道pipe
int pipe( int fd[2] );2.流管道返回值:成功,返回0,否則返回-1。引數陣列包含pipe使用的兩個檔案的描述符。fd[0]:讀管道,fd[1]:寫管道。
必須在fork()中呼叫pipe(),否則子程序不會繼承檔案描述符。兩個程序不共享祖先程序,就不能使用pipe。但是可以使用命名管道。
#include #include #include #include #include int main()
if((pid=fork())==0)
close(pipe_fd[0];
exit(0);
} else if(pid>0)
}
#include #include #include #include #define bufsize 1000
int main()
3.命名管道fifo
特點:1.fifo是作為乙個特殊的裝置檔案存在;
2.不同祖先程序的程序之間可以共享資料;3.使用完後fifo將繼續儲存。
#include #include #include #include #include #include #include #define fifo "/tmp/myfifo" //管道位置
main(int argc,char** argv)
while(1)
printf("read %s from fifo\n",buf_r);
sleep(1);
} pause();
unlink(fifo);
}
通常對命名管道的讀在寫之前。
#include #include #include #include #include #include #include #define fifo_server "/tmp/myfifo"
main(int argc,char** argv) //argc:引數個數? argv:引數
else
printf("write %s to the fifo\n",w_buf);
}
fifo建立後,可以用open(),close(),read(),write(),unlink()等流操作函式操作。
linux中匿名管道和命名管道
1 建立管道和父子程序,子程序關閉讀端,父程序關閉寫端,子程序寫,父程序讀。2 如果所有指向管道寫端的檔案描述符都關閉了 管道寫端的引用計數等於0 而仍然有程序 從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會返回0,就像讀到檔案末尾一樣。3 如果有指向管道寫端的檔案描述符沒關閉 ...
普通管道和命名管道
2116 0 管道分為普通管道和命名管道 兩者都是半雙工的。普通管道只能用於父子程序或兄弟程序間的通訊,因為普通管道通過fork呼叫來拷貝檔案描述符的,在檔案系統中,普通管道並不對應物理檔案。命名管道在檔案系統中有物理檔案存在,因此可以用於非親屬的程序間通訊。include int pipe int...
命名管道和匿名管道
我們知道程序間是可以通訊的。可以達到資料傳輸 資源共享 事件通知 程序控制等目的。程序間通訊主要包括管道 系統ipc,套接字等。管道分為三種 1 普通管道 int pipe int fds 2 返回值0表示成功,1表示失敗 fd 0 讀 fd 1 寫 子程序往管道中寫資料,寫資料時要關閉讀端 父程序...