linux下有名管道程序通訊

2022-07-19 13:33:14 字數 2137 閱讀 6095

1、學習mkfifo等函式;

2、了解有名管道的特點、阻塞開啟與非阻塞開啟等;

3、編寫乙個關於有名管道程序通訊的程式,並執行。

1、相關函式

建立有名管道的函式是mkfifo,函式原型是:

int mkfifo (const char *__path, __mode_t __mode)

功能:建立新的帶命名路徑的fifo

引數:path — 命名管道路徑

mode — 模式許可權

返回值:成功返回0,失敗返回-1;

2、有名管道的特點

a)、使不同程序之間完成通訊。

通過mkfifo建立fifo檔案建立有名管道,

使得不同程序可以通過像訪問檔案的方式一樣來訪問有名管道,

fifo檔案特點:

先進先出:即寫檔案從有名管道資料尾端寫入,資料讀取從有名管道的開始處讀取。

b)、有名管道內資料不支援如lseek()檔案定位操作。

3、阻塞開啟與非阻塞開啟

對於讀程序:

•若該管道是阻塞開啟,且當前fifo內沒有資料,則對讀程序而言將一直阻塞到有資料寫入;

•若該管道是非阻塞開啟,則不論fifo內是否有資料,讀程序都會立即執行讀操作。即如果fifo內沒有資料,則讀函式將立刻返回0、

對於寫程序:

•若該管道是阻塞開啟,則寫操作將一直阻塞到資料可以被寫入;

•若該管道是非阻塞開啟而不能寫入全部資料,則讀操作進行部分寫入或者呼叫失敗。

分別輸入形成三個檔案mkfifo.c、client.c、service.c,**如下:

/*

mkfifo.c

*/#include

"stdio.h

"#include

"unistd.h

"int

main()

printf(

"creat mkfifo.c sucess\n");

return0;

}

/*

service.c

*/#include

"unistd.h

"#include

"fcntl.h

"#include

"stdio.h

"#include

"stdlib.h

"#include

"string.h

"int

main()

; fd=open("

./a.c

",o_rdonly);

if(fd<0

)

while(1

)

sleep(1);

close(fd);

return0;

}

/*

client.c

*/#include

"unistd.h

"#include

"fcntl.h

"#include

"stdio.h

"#include

"stdlib.h

"#include

"string.h

"int

main()

while(1)}

sleep(1);

close(fd);

return0;

}

1)、生成可執行檔案

終端輸入:

gcc mkfifo.c -o mkfifo

gcc service.c -o service

gcc client.c -o client

2)、執行

先執行mkfifo,終端輸入:./mkfifo

開啟兩個終端分別執行 service、client

終端分別輸入 :./service       ./client

即可實現通訊!

Linux程序通訊 有名管道

管道 pipe 是無名管道,他是程序資源的一部分,隨著程序的結束而消失。並且它只能在擁有公共祖先程序的程序內通訊。而有名管道 fifo 的出現則解決了這個問題。fifo提供了乙個路徑名與它關聯。這樣可以通過訪問該路徑就能使得兩個程序之間相互通訊。此處的fifo嚴格遵守 先進先出 原則。讀總是從頭開始...

Linux程序通訊 有名管道

管道 pipe 是無名管道,他是程序資源的一部分,隨著程序的結束而消失。並且它只能在擁有公共祖先程序的程序內通訊。而有名管道 fifo 的出現則解決了這個問題。fifo提供了乙個路徑名與它關聯。這樣可以通過訪問該路徑就能使得兩個程序之間相互通訊。此處的fifo嚴格遵守 先進先出 原則。讀總是從頭開始...

程序通訊 有名管道

無名管道只能由父子程序使用 但是通過命名管道,不相關的程序也能交換資料。建立管道mkfifo 開啟管道open 讀管道read 寫管道write 關閉管道close 刪除管道unlink 函式作用 建立有名管道 函式原型 int mkfifo const char pathname,mode t m...