Linux下有名管道m(xù)kfifo使用詳解
Linux下實(shí)現(xiàn)進(jìn)程通信的方式有很多種,今天要說(shuō)的是有名管道,有名管道比命名管道的優(yōu)勢(shì)是可以在任何進(jìn)程之間傳遞數(shù)據(jù)。有名管道通信是依賴于管道文件這種特殊類型文件來(lái)進(jìn)行的。
1.mkfifo命令
mkfifo命令可以創(chuàng)建管道文件,例如:

如上文件類型是p代表的就是管道文件。
2.mkfifo庫(kù)函數(shù)
man 3 mkfifo

mkfifo函數(shù)是glibc庫(kù)中實(shí)現(xiàn)的一個(gè)接口,如下利用mkfifo來(lái)實(shí)現(xiàn)進(jìn)程之間數(shù)據(jù)傳輸。
server.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h>
#define FIFO_PATH "./fifo"
int main()
{
umask(0);
// 創(chuàng)建管道
int ret = mkfifo(FIFO_PATH, 0666);
// 打開管道
int fd = open(FIFO_PATH, O_RDONLY);
if(fd > 0) {
char buf[1024] = {0};
while(1){
//管道讀取數(shù)據(jù)
int ret = read(fd, buf, sizeof(buf) - 1);
buf[ret] = 0;
if(ret > 0){
printf("%s", buf);
fflush(stdout);
}
// 客戶端不寫入數(shù)據(jù),則停止讀取
else if(ret == 0){
printf("client quit\n");
break;
}
else{
perror("read filed\n");
break;
}
}
}
close(fd);
return 0;
}client.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <stdlib.h>
#define FIFO_PATH "./fifo"
#define WRITE_TIMES 5
/*
標(biāo)準(zhǔn)輸入輸出錯(cuò)誤輸出 FILE*:
stdin
stdout
stderr
標(biāo)準(zhǔn)輸入輸出錯(cuò)誤輸出fd:
STDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2
*/
int main()
{
//打開管道
int fd = open(FIFO_PATH, O_WRONLY);
char buf[64] = {0};
int times = 0;
while(1)
{
// 寫入5次
if (++times > WRITE_TIMES) {
break;
}
printf("please input info :");
fflush(stdout);
//從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù)寫入進(jìn)管道。
ssize_t ret = read(0, buf, sizeof(buf) - 1);
if(ret > 0){ //將讀取到的數(shù)據(jù)往文件中寫入
buf[ret] = 0;
write(fd, buf, sizeof(buf) - 1);
}
else {
perror("read");
}
}
close(fd);
return 0;
}Makefile
.PHONY: all all: server client server: server.c gcc -o $@ $^ client: client.c gcc -o $@ $^ .PHONY: clean clean: rm server client fifo -rf
代碼結(jié)構(gòu):

運(yùn)行兩個(gè)server進(jìn)程,兩個(gè)client進(jìn)程




從運(yùn)行結(jié)果看, 兩個(gè)client進(jìn)程往管道寫入5段數(shù)據(jù)信息,兩個(gè)server進(jìn)程從管道讀取數(shù)據(jù),管道有互斥功能,同一時(shí)刻只能有一個(gè)進(jìn)程從管道讀取數(shù)據(jù)。
到此這篇關(guān)于Linux下有名管道m(xù)kfifo使用的文章就介紹到這了,更多相關(guān)Linux mkfifo使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一個(gè)簡(jiǎn)潔的全自動(dòng)安裝LNMP服務(wù)器環(huán)境的Shell腳本分享
這篇文章主要介紹了一個(gè)簡(jiǎn)潔的全自動(dòng)安裝LNMP服務(wù)器環(huán)境的Shell腳本分享,本文腳本在生產(chǎn)環(huán)境上使用了一年多,腳本代碼簡(jiǎn)單唯美,需要的朋友可以參考下2014-12-12
shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測(cè)
這篇文章主要介紹了shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測(cè),本文給出的腳本使用對(duì)比MD5的方法,檢測(cè)linux系統(tǒng)文件是否被替換等問題,需要的朋友可以參考下2014-12-12
一個(gè)強(qiáng)大的網(wǎng)絡(luò)分析shell腳本分享(實(shí)時(shí)流量、連接統(tǒng)計(jì))
這篇文章主要介紹了一個(gè)強(qiáng)大的網(wǎng)絡(luò)分析shell腳本分享,此腳本包含實(shí)時(shí)流量統(tǒng)計(jì)、連接統(tǒng)計(jì)強(qiáng)大功能,需要的朋友可以參考下2014-12-12

