程序通訊程式整理 管道(Linux)

2021-08-13 05:30:09 字數 1699 閱讀 2523

#include#include#includeint main()

; //定義乙個陣列,作為管道的兩端(讀端和寫端)

int count = 0; //用結果直觀來看管道通訊

int ret; //返回讀寫的返回值

pipe(fd); //建立管道

pid = fork(); //建立程序

//注意:要在建立程序之前建立管道,這樣是建立乙個管道,子父程序分別對應讀寫端。如果寫在後面,程式就會分別在子父程序中建立管道,導致通訊失敗。

if(-1 == pid) //建立程序失敗

else if(0 == pid) //子程序 }

else //父程序

count++;

printf("parent process count :%d \n",count);

waitpid(pid,null,0); //暫停目前的程序,直到子程序結束(相當於收屍子程序)

} return 0;

}執行結果:

child process count:1

parent process count :2

讀檔案:

#include #include #include #include#include#include#includeint main()

; ret = mkfifo("fifo.tmp",o_creat|o_excl); //mkfifo()使用路徑名稱建立乙個fifo特殊檔案,模式指定了fifo的許可權。這個檔案類似於乙個管道,但是它是以一種不同的方式在乙個管道中建立的,而不是作為乙個匿名的通訊渠道,通過呼叫mkfifo()將乙個fifo特殊檔案輸入到檔案系統中。一旦您以這種方式建立了fifo特殊檔案,任何程序都可以開啟它閱讀或寫作,就像普通的檔案一樣。但是,在你對其進行任何輸入或輸出操作之前它必須同時在兩端同時開啟。開啟乙個fifo的讀取通常會阻塞,直到其他程序開啟相同的fifo對於寫作,反之亦然。

if(-1 == ret)

fd = open("fifo.tmp",o_rdonly); //以唯讀的方式開啟

if(-1 == fd)

while(1) //製作乙個迴圈用來讀取資料

if(!strncmp(buf,"bye",3)) //讀到bye結束(將buf中前三個字元和bye比較,一樣則返回0)

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

memset(buf,0,sizeof(buf)); //將buf中的內容初始化

} return 0;

}寫檔案:

#include #include #include #include#include#include#includeint main()

; fd = open("fifo.tmp",o_wronly); //以只寫的方式開啟檔案

if(-1 == fd)

while(1)

if(!strncmp(buf,"bye",3))

memset(buf,0,sizeof(buf));

} unlink("fifo.tmp");//刪除檔案,否則下次執行該程式會報錯,報錯型別為該檔案已存在

return 0;

}執行結果:

hello read:hello

wrold read:wrold

bye !

linux 程序通訊 管道通訊

程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...

linux程序通訊之管道

管道 可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊 父子程序 命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料...

linux程序通訊 管道

管道分為有名管道和無名管道。無名管道 無名管道是半雙工的,就是對於乙個管道來講只能讀或者寫。就像高速公路一樣一條路只能單向行駛。建立無名管道的函式 所需要標頭檔案 include 函式原型 int pipe int fd 2 函式的返回值 失敗返回 1,成功返回0 乙個簡單的無名管道的例子 main...