1. 程式人生 > >select實現多路複用

select實現多路複用

#include
#include
#include
#include
#include
#include
#include

#define FIFO1      "in1"
#define FIFO2	   "in2"
#define MAX_BUFFER_SIZE     1024  //緩衝區大小
#define IN_FILES	3  //多路複用輸入檔案數目
#define TIME_DELAY  60   //超時值秒數
#define MAX(a,b)    ((a>b)?(a):(b)) 

int main(void)
{
	int fds[IN_FILES];  //管道描述符
	char buf[MAX_BUFFER_SIZE]; 
	int i,res,real_read,maxfd;
	struct timeval tv; 
	fd_set  inset,tmp_inset;//檔案描述符集

	fds[0]=0;  //終端的檔案描述符
	/*建立兩個有名管道*/
	if(access(FIFO1,F_OK)==-1)
	{
		if((mkfifo(FIFO1,0666)<0)&&(errno!=EEXIST))
		{
			printf("Cannot create fifo1 file\n");
			exit(1);
		}
	}

	if(access(FIFO2,F_OK)==-1)
	{
		if((mkfifo(FIFO2,0666)<0)&&(errno!=EEXIST))
		{
			printf("Cannot create fifo2 file\n");
			exit(1);
		}
	}

	/*以只讀非阻塞方式開啟兩個管道檔案*/
	if((fds[1]=open(FIFO1,O_RDONLY|O_NONBLOCK))<0)
	{
		printf("Open in1 error\n");
		return 1;
	}

	if((fds[2]=open(FIFO2,O_RDONLY|O_NONBLOCK))<0)
	{
		printf("Open in2 error\n");
		return 1;
	}

	/*取出兩個檔案描述符中的較大者*/
	maxfd=MAX(MAX(fds[0],fds[1]),fds[2]);

	/*初始化讀集inset,並在讀檔案描述符集中加入相應的描述集*/
	FD_ZERO(&inset);  /*將inset清零,使集合中不含任何fd*/
	for(i=0;i