* Created: Nov 13th 2013
* Author: freeking
* Descripition fifo 实现client发送一个路径/文件名,sever返回该文件
* 的内容。
* ******************************************************************/
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#define MAXLINE 4096
#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"
#define FILE_MODE 0664
client.c
#include "fifo.h"
void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINE];
if (NULL == fgets(buff, MAXLINE, stdin))
{
perror("fgets");
}
len = strlen(buff);
if (buff[len - 1] = '\0')
len--;
write(writefd, buff, len);
memset(buff, 0, MAXLINE-1);
while ((n = read(readfd, buff, MAXLINE)) > 0 )
{
//printf("~~~~%d : %s\n", __LINE__, buff);
write(STDOUT_FILENO, buff, n);
}
}
int main(int argc, char ** argv)
{
int readfd, writefd;
writefd = open(FIFO1, O_WRONLY, 0);
readfd = open(FIFO2, O_RDONLY, 0);
client(readfd, writefd);
close(readfd);
close(writefd);
unlink(FIFO1);
unlink(FIFO2);
return 0;
}
server:
#include "fifo.h"
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff[MAXLINE] = {0};
if (0 == (n = read(readfd, buff, MAXLINE)))
{
perror("end of file");
return;
}
buff[n] = '\0';
if ((fd = open(buff, O_RDONLY)) < 0)
{
snprintf(buff + n, sizeof(buff) - n, ":can't open , %s\n", strerror(errno));
n = strlen(buff);
write(writefd, buff, n);
}
else
{
memset(buff, 0, MAXLINE-1);
while((n = read(fd, buff, MAXLINE)) > 0)
{
write(writefd, buff, n);
}
close(fd);
}
}
int main(int argc, char ** argv)
{
int readfd, writefd;
/* create two FIFOs; OK if they already exsit */
if ((mkfifo(FIFO1, FILE_MODE) < 0) && errno != EEXIST)
{
perror("can't create FIFO1");
}
if ((mkfifo(FIFO2, FILE_MODE) < 0) && errno != EEXIST)
{
unlink(FIFO2);
perror("can't create FIFO2");
}
readfd = open(FIFO1, O_RDONLY, 0);
writefd = open(FIFO2, O_WRONLY, 0);
server(readfd, writefd);
return 0;
}
验证方式:
1:后台方式启动server
2:启动client,输入路径+文件名