码迷,mamicode.com
首页 > 其他好文 > 详细

FIFO

时间:2014-07-21 10:36:45      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:style   http   使用   os   文件   2014   

Pipes have no names, and their biggest disadvantage is that they can be used  only between processes that have a parent process in common. Two unrelated processes can- 

not create a pipe between them and use it for IPC

FIFO stands for first in, first out, and a Unix FIFO is similar to a pipe. It is a one-way (half-duplex) flow of data. But unlike pipes, a FIFO has a pathname associated with it, allowing unrelated processes to access a single FIFO. 

FIFO是有名管道,有一个路径与之关联,允许无亲缘关系的进程通信,单向。

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo (const char *pathname, mode-t mode) 

Returns: 0 if OK, -1 on error

 创建一个新的fifo或者返回错误,如果返回错误使用open或fopen打开,FIFO是半双工,不能同时读和写

#include	"unpipc.h"

#define	FIFO1	"/tmp/fifo.1"
#define	FIFO2	"/tmp/fifo.2"

void	client(int, int), server(int, int);

int
main(int argc, char **argv)
{
	int		readfd, writefd;
	pid_t	childpid;

		/* 4create two FIFOs; OK if they already exist */
	if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST))
		err_sys("can‘t create %s", FIFO1);
	if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST)) {
		unlink(FIFO1);
		err_sys("can‘t create %s", FIFO2);
	}

	if ( (childpid = Fork()) == 0) {		/* child */
		readfd = Open(FIFO1, O_RDONLY, 0);
		writefd = Open(FIFO2, O_WRONLY, 0);

		server(readfd, writefd);
		exit(0);
	}
		/* 4parent */
	writefd = Open(FIFO1, O_WRONLY, 0);
	readfd = Open(FIFO2, O_RDONLY, 0);

	client(readfd, writefd);

	Waitpid(childpid, NULL, 0);		/* wait for child to terminate */

	Close(readfd);
	Close(writefd);

	Unlink(FIFO1);
	Unlink(FIFO2);
	exit(0);
}

bubuko.com,布布扣

无亲缘关系的客户与服务器

server_main.c

#include	"fifo.h"

void	server(int, int);

int
main(int argc, char **argv)
{
	int		readfd, writefd;

		/* 4create two FIFOs; OK if they already exist */
	if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST))
		err_sys("can‘t create %s", FIFO1);
	if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST)) {
		unlink(FIFO1);
		err_sys("can‘t create %s", FIFO2);
	}

	readfd = Open(FIFO1, O_RDONLY, 0);
	writefd = Open(FIFO2, O_WRONLY, 0);

	server(readfd, writefd);
	exit(0);
}

fifo.h

#include	"unpipc.h"

#define	FIFO1	"./fifo.1"
#define	FIFO2	"./fifo.2"

client_main.c

#include	"unpipc.h"

void
client(int readfd, int writefd)
{
	size_t	len;
	ssize_t	n;
	char	buff[MAXLINE];

		/* 4read pathname */
	Fgets(buff, MAXLINE, stdin);
	len = strlen(buff);		/* fgets() guarantees null byte at end */
	if (buff[len-1] == ‘\n‘)
		len--;				/* delete newline from fgets() */

		/* 4write pathname to IPC channel */
	Write(writefd, buff, len);

		/* 4read from IPC, write to standard output */
	while ( (n = Read(readfd, buff, MAXLINE)) > 0)
		Write(STDOUT_FILENO, buff, n);
}


单个服务器,多个客户

单个服务器,多个客户:服务器以一个众所周知的路径名创建一个FIFO,从这个FIFO读入客户的请求。每个客户在启动时创建自己的FIFO,所用的路径名包含有自己的进程id。每个客户把自己的请求写入服务器的众所周知的FIFO中,请求中包含客户的进程id以及一个路径名。具有该路径名的文件就是客户希望服务器打开并发回的文件。

bubuko.com,布布扣


FIFO,布布扣,bubuko.com

FIFO

标签:style   http   使用   os   文件   2014   

原文地址:http://my.oschina.net/hnuweiwei/blog/292480

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!