程序通訊--命名管道(FIFO)
阿新 • • 發佈:2019-02-15
一.命名管道(FIFO)
FIFO不同於管道之處在於它提供一 個路徑名與之關聯,以FIFO的檔案形式儲存於檔案系統中。命名管道是一個裝置檔案,因 此,即使程序與建立FIFO的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過FIFO 相互通訊。值得注意的是,FIFO(first input first output)總是按照先進先出的原則工作,第一 個被寫入的資料將首先從管道中讀出。
二.命名管道的建立
int mkfifo(const char *path,mode_t mode);
int mknod(const char *path,mode_t mod,dev_t dev);
函式mknod引數中path為建立的命名管道的全路徑名:mod為建立的命名管道的模式,指明其存取許可權;dev為裝置值,該值取決於檔案建立的種類,它只在建立裝置檔案時才會用到。這兩個函式呼叫成功都返回0,失敗都返回-1。
三.測試用例
1.標頭檔案
#pragma once #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<errno.h> #include<string.h> #include<fcntl.h> #include<unistd.h> #define _FIFO_NAME_ "./my_fifo" #define _SIZE_ 1024
2:server端
3.client端#include"comm.h" int main() { if(mkfifo(_FIFO_NAME_,S_IFIFO | 0666) < 0) { printf("errno:%d,strerror:%s\n",errno,strerror(errno)); } int fd = open(_FIFO_NAME_,O_RDONLY); if(fd < 0) { printf("%s\n",strerror(errno)); return 2; } char buf[_SIZE_]; while(1) { memset(buf,'\0',sizeof(buf)); read(fd,buf,sizeof(buf) - 1); printf("client# %s\n",buf); } close(fd); return 0; }
#include"comm.h"
int main()
{
int fd = open(_FIFO_NAME_,O_WRONLY);
if(fd < 0)
{
printf("%s\n",strerror(errno));
}
char buf[_SIZE_];
while(1)
{
printf("Please enter# :");
memset(buf,'\0',sizeof(buf));
ssize_t _s = read(1, buf, sizeof(buf) - 1);
if(_s > 0)
{
buf[_s - 1] = '\0';
}
write(fd,buf,strlen(buf));
}
return 0;
}
四.測試結果
以上就是本人在學習過程中的一些經驗總結。當然,本人能力有限,難免會有紕漏,希望大家可以指正。