|
按照书上写 了一个程序结果是正确的,但有的地方看不懂,请大虾指教 了谢谢阿 :)
以下是程序,看不懂为什么从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函数在这里有什么作用阿 |
|