poll函数原型
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<poll.h>
int main(int argc,char* argv[])
{
// if(argc !=3)
// {
// printf("Usage #: %s [ip] [port]\n",argv[0]);
// exit(1);
// }
//创建数组,用以指定我们感兴趣的文件描述符上发生的可读、可写和异常等事件
// struct pollfd
// {
// int fd; //件描述符
// short events; //注册的事件
// short revents; //``实际发生的事件,由内核填充,输出型
// };
struct pollfd fds[2]; //文件描述符
fds[0].fd=0;
fds[0].events=POLLIN; //对读事件感兴趣
fds[0].revents=0;//输出型
fds[1].fd=1;
fds[1].events=POLLOUT;//对写事件感兴趣
fds[1].revents=0;
char buf[1024];
int done=0;
int i=0;
int timeout=5000;//5000毫秒,即5秒
while(!done)
{
int ret=poll(fds,sizeof(fds)/sizeof(fds[0]),timeout);
switch(ret)
{
case -1:
perror("poll");
exit(2);
break;
case 0:
printf("timeout...\n");
break;
default:
//有事件就绪,但还需判断是哪个文件描述符的什么事件
for(i=0;i<sizeof(fds)/sizeof(fds[0]);++i)
{
//是否可读
//fds[i]所关心的事件是读,而是有读事件发生
if(fds[i].fd==0&&(fds[i].revents & POLLIN))
{
memset(buf,'\0',sizeof(buf));
ssize_t _s=read(0,buf,sizeof(buf)-1);
if(_s>0)
{
buf[_s -1]='\0';
if(strncmp(buf,"quit",4)==0)
{
close(fds[i].fd);
exit(0);
}
printf("echo#:%s\n",buf);
}
}
if(fds[i].fd==1&&(fds[i].revents & POLLOUT))
{
memset(buf,'\0',sizeof(buf));
strcpy(buf,"mengxiangjia");
printf("echo#:%s\n",buf);
sleep(3);
}
}
break;
}
}
return 0;
}