FIFO,同时也被称为有命管道,未命名的管道只能用于有亲缘关系之间的进程间的通信,而命名管道可以实现两个互不相关之间进程的通信。在Linux下,我们可以通过mkfifo命令创建命名管道,FIFO实际上并不占取实际的存储空间,只是在内核pipe中的一个链接。我们可以通过其大小来查看。
FIFO实际结构为
创建FIFO的函数为
int mkfifo(const char*path,mode_t mode)
利用fifo实现不同进程间通信的例子
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#define MAXSIZE 1024
#define FIFO1 "./myfifo1"
void sys_err(const char *str,int exitno)
{
perror(str);
exit(exitno);
}
int main()
{
int len;
int readfd;
char recv[MAXSIZE];
if(mkfifo(FIFO1,O_CREAT|O_EXCL)<0)
{
if(EEXIST != errno)
{
sys_err("mkfifo",1);
}
}
readfd = open(FIFO1,O_RDONLY,0);
len = read(readfd,recv,sizeof(recv));
write(STDOUT_FILENO,recv,len);
close(readfd);
unlink(FIFO1);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#define MAXSIZE 1024
#define FIFO1 "./myfifo1"
void sys_err(const char *str,int exitno)
{
perror(str);
exit(exitno);
}
int main()
{
int len;
int writefd;
char send[MAXSIZE];
if(mkfifo(FIFO1,O_CREAT|O_EXCL)<0)
{
if(EEXIST != errno)
{
sys_err("mkfifo",1);
}
}
writefd = open(FIFO1,O_WRONLY,0);
strcpy(send,"too young to simple");
write(writefd,send,strlen(send));
close(writefd);
unlink(FIFO1);
return 0;
}