LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 680|回复: 1

问select函数问题

[复制链接]
发表于 2007-5-9 12:01:17 | 显示全部楼层 |阅读模式
按照书上写 了一个程序结果是正确的,但有的地方看不懂,请大虾指教 了谢谢阿 :)
以下是程序,看不懂为什么从hello1文件读出一次内容后他的文件描述符fds[0]就变为0
了 ,而向hello2文件里写一次以后他的文件描述符就不变阿。这个程序完成的功能是每
隔10s中就向hello2文件写一次数据。
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
int main(void)
{
   int fds[2];
   char buf[7]="hello!\n";
   int i,rc,maxfd;
   fd_set inset1,inset2;
   struct timeval tv;
   if((fds[0]=open("hello1",O_RDWR|O_CREAT,0666))<0)
       perror("open hello1");
   if((fds[1]=open("hello2",O_RDWR|O_CREAT,0666))<0)
       perror("open hello2");
   rc=write(fds[0],buf,7);
   if(rc)
        printf("rc=%d\n",rc);
   lseek(fds[0],0,SEEK_SET);
   maxfd=fds[0]>fds[1]?fds[0]:fds[1];
   FD_ZERO(&inset1);
   FD_SET(fds[0],&inset1);
   FD_ZERO(&inset2);
   FD_SET(fds[1],&inset2);
   tv.tv_sec=2;
   tv.tv_usec=0;
   while(FD_ISSET(fds[0],&inset1)||FD_ISSET(fds[1],&inset2)){
      if(select(maxfd+1,&inset1,&inset2,NULL,&tv)<0)
        perror("select");
      else{
        if(FD_ISSET(fds[0],&inset1)){
            rc=read(fds[0],buf,7);
            if(rc>0){
               buf[rc]='\0';
               printf("read:%s\n",buf);
               }else
                  perror("read");
                }
      if(FD_ISSET(fds[1],&inset2)){
            rc=write(fds[1],buf,7);
            if(rc>0){
               buf[rc]='\0';
               printf("rc:%d,write:%s\n",rc,buf);
               }else
                  perror("write");
                  sleep(10);
                }
                }
                }
                exit(0);
                }
另外select函数在这里有什么作用阿
 楼主| 发表于 2007-5-9 21:48:15 | 显示全部楼层
怎么没人回答阿:(
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表