什麼是管道?
管道是單向的、先進先出的,他把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。
管道建立
管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於同一系統中的任意兩個程序間的通訊。
無名管道由pipe()函式建立:
int pipe(int filedis[2]);
當乙個管道建立時,他會建立兩個檔案描述符:
filedis[0]用於讀管道,filedis[1]用於寫管道。
管道關閉
關閉管道只需要將這兩個檔案描述符關閉即可,可以使用普通的close函式逐個關閉。
eg:
#include
#include
#include
#include
int main(void)
else
printf("pipe creat success\n!");
close(pipe_fd[0]);
close(pipe_fd[1]);
}
管道讀寫管道用於不同程序見得通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道。
注意事項
必須在系統呼叫fork()前呼叫pipe()否則子程序將不會繼承檔案描述符。
例:pipe_rw.c
#include
#include
#include
#include
#include
int main(void)
/*建立子程序*/
命名管道
#include
#include
int mkfifo(const
char* pathname,mode_t mode)
**pathname:**fifo檔名
mode:屬性
一旦建立了乙個fifo,就可以用open開啟它,一般的檔案訪問函式(close、read、write等)都可以用於fifo。
操作
當開啟fifo時,非阻塞標誌(o_nonblock)將對以後的讀寫產生如下影響:
1、沒有使用o_nonblock:訪問要求將阻塞。
2、使用o_nonblock:訪問無法滿足時不阻塞,立刻返回出錯。errno是enxio.
例子:使用mkfifo建立有名管道並實現兩個程序之間的通訊。
/*fifo_read.c*/
#include
#include
#include
#include
#include
#include
#include
#define fifo "/tmp/myfifo"
/* * 程式入口
* */
int main(int argc,char** argv)
while(1)
printf("read %s from fifo\n",buf_r);
sleep(1);
}/*後面三句話是不會被執行到的,但不會影響程式執行的效果當程式在上面的死迴圈中執行時收到訊號後會馬上結束執行而沒有執行後面的三句話。這些會在後面的訊號處理中講到,現在不理解沒有關係,這個問題留給大家學習了訊號處理之後來解決。*/
close(fd); //關閉管道
pause(); /*暫停,等待訊號*/
unlink(fifo); //刪除檔案
}
/*fifo_write.c
#include
#include
#include
#include
#include
#include
#include
#define fifo_server "/tmp/myfifo"
/* * 程式入口
* */
int main(int argc,char** argv)
/*開啟管道*/
fd=open(fifo_server,o_wronly |o_nonblock,0);
if(fd==-1)
/*入參檢測*/
if(argc==1)
strcpy(w_buf,argv[1]);
/* 向管道寫入資料 */
if((nwrite=write(fd,w_buf,100))==-1)
else
close(fd); //關閉管道
linux c開發(5 3)程序間通訊 訊號通訊
訊號 signal 機制是unix系統中最為古老的程序間通訊機制,有很多條件可以產生乙個訊號 1 當使用者按某些按鍵時,產生訊號。2 硬體異常產生訊號 除數為零,無效的儲存訪問等等。這些訊號通常有硬體檢測得到,將其通知核心,然後核心產生適當的訊號通知程序,例如 核心對正在訪問乙個無效儲存區的程序產生...
linux C 程序間通訊 訊息佇列
linux 引入訊息佇列的原因是,實現對緊急事件的處理。可以為訊息設定優先順序 下面是乙個共享訊息佇列的例子,在linux2.6的核心中能夠執行,通過訊息佇列實現程序間的通訊,可以自己選擇優先順序,本列優先順序設定為子程序自己的pid.2.6中能夠執行,include include include...
Linux C 程序間的訊號通訊
1 訊號通訊 核心中存在64種訊號,即linux 核心可以傳送64種訊號,命令 kill l 可以檢視 a 訊號的傳送 kill raise alarm kill pid t pid,int sig raise int sig 等價於 kill getpid int sig 即發給自己 附 終止程序...