注意open打开fifo的方式, 有阻塞和非阻塞模式
如果读阻塞模式打开, 那么要等到一个进程写入fifo之后, 这个读open才会打开
1 客户端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#define FIFO1 "/tmp/fifo.3"
#define FIFO2 "/tmp/fifo.4"
#define MAXLINE 4096
void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINE]="hello this is client";
write(writefd, buff,strlen(buff));
/* 4read from IPC, write to standard output */
while ( (n = read(readfd, buff, MAXLINE)) > 0)
{
}
}
int main(int argc, char **argv)
{
int readfd, writefd;
char buff[MAXLINE]="hello this is client";
/* 4create two FIFOs; OK if they already exist */
if ((mkfifo(FIFO1, 0666) < 0)){
perror("文件创建失败");
}
printf("after open\n");
if ((mkfifo(FIFO2, 0666) < 0)) {
perror("文件创建失败");
}
readfd = open(FIFO1, O_RDONLY);
writefd = open(FIFO2, O_WRONLY);
client(readfd, writefd);
exit(0);
}
2 服务器
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define FIFO1 "/tmp/fifo.3"
#define FIFO2 "/tmp/fifo.4"
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
#define MAXLINE 4096
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff[MAXLINE+1];
/* 4open succeeded: copy file to IPC channel */
while ( (n = read(readfd, buff, MAXLINE)) > 0)
{
write(STDOUT_FILENO, buff,n);
}
}
int main(int argc, char **argv)
{
int readfd, writefd;
/* 4create two FIFOs; OK if they already exist */
if ((mkfifo(FIFO1, 0666) < 0)){
perror("文件创建失败");
}
if ((mkfifo(FIFO2, 0666) < 0)) {
perror("文件创建失败");
}
writefd = open(FIFO1, O_WRONLY );
readfd = open(FIFO2,O_RDONLY );
server(readfd, writefd);
exit(0);
}