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;
}
/*1)、生成可執行檔案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;
}
終端輸入:
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...