924742206 发表于 2014-02-28 19:09

关于FD_ISSET疑惑??

这是程序:
/*select.c*/
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int fds;
char buf;
int i,rc,maxfd;
fd_set inset1,inset2;
struct timeval tv;
/*首先按一定的权限打开hello1文件*/
if((fds = open ("hello1", O_RDWR|O_CREAT,0666))<0)
perror("open hello1");
/*再按一定的权限打开hello2文件*/
if((fds = open ("hello2", O_RDWR|O_CREAT,0666))<0)
perror("open hello2");
if((rc = write(fds,"Hello!\n",7)))
printf("rc=%d\n",rc);
lseek(fds,0,SEEK_SET);
/*取出两个文件描述符中的较大者*/
maxfd = fds>fds ? fds : fds;
/*初始化读集合inset1,并在读集合中加入相应的描述集*/
FD_ZERO(&inset1);
FD_SET(fds,&inset1);
/*初始化写集合inset2,并在写集合中加入相应的描述集*/
FD_ZERO(&inset2);
FD_SET(fds,&inset2);
tv.tv_sec=2;
tv.tv_usec=0;
/*循环测试该文件描述符是否准备就绪,并调用select函数对相关文件描述符做对应操作*/
while(FD_ISSET(fds,&inset1)||FD_ISSET(fds,&inset2)){
if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0)
perror("select");
else{
if(FD_ISSET(fds,&inset1)){
rc = read(fds,buf,7);
if(rc>0){
buf='\0';
printf("read: %s\n",buf);
}else
perror("read");
}
if(FD_ISSET(fds,&inset2)){
rc = write(fds,buf,7);
if(rc>0){
buf='\0';
printf("rc=%d,write: %s\n",rc,buf);
}else
perror("write");
sleep(10);
}
}
}
exit(0);
}
这是运行结果:为什么read: Hello!只有一次

页: [1]
查看完整版本: 关于FD_ISSET疑惑??