匿名管道pipe前面已經說過了,接下來就說命名管道FIFO;
ide
咱們能夠使用如下函數之一來建立一個命名管道,他們的原型以下:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename, mode_t mode);
int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0);這兩個函數都能建立個FIFO, 注意是建立一個真實存在於文件系統中的文件,filename指定了文件名,mode則指定了文件的讀寫權限。 mknod是比較老的函數,而使用mkfifo函數更加簡單和規範,因此建議在可能的狀況下,儘可能使儘可能使用mkfifo而不是mknod。
函數
mkfifo函數的做用是在文件系統中建立一個文件,該文件用於提供FIFO功能,即命名管道。前邊講的那些管道都沒有名字,所以它們被稱爲匿名管道,或簡稱管道。對文件系統來講,匿名管道是不可見的,它的做用僅限於在父進程和子進程兩個進程間進行通訊。而命名管道是一個可見的文件,所以,它能夠用於任何兩個進程之間的通訊,無論這兩個進程是不是父子進程,也無論這兩個進程之間有沒有關係。
spa
server.c readorm
#include<stdio.h>server
#include<sys/types.h>進程
#include<sys/stat.h>ip
#include<unistd.h>原型
#include<string.h>string
#include<fcntl.h>it
int main()
{
if(mkfifo("./fifo",S_IFIFO|0666) < 0)
{
perror("mkfifo");
return 1;
}
int fd=open("./fifo",O_RDONLY);
if(fd<0)
{
perror("open");
return 2;
}
char buf[1024];
while(1)
{
memset(buf,'\0',sizeof(buf));
read(fd,buf,sizeof(buf)-1);
printf("client#%s",buf);
}
close(fd);
return 0;
}
client.c write
代碼以下:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
int main()
{
int fd=open("./fifo",O_WRONLY);
if(fd<0)
{
perror("open");
return 2;
}
char buf[1024];
while(1)
{
printf("please enter#");
fflush(stdout);
ssize_t sz=read(0,buf,sizeof(buf)-1);
if(sz>0)
{
buf[sz]='\0';
}
write(fd,buf,strlen(buf));
}
close(fd);
return 0;
}