您的位置:程序门 -> linux/unix社区 ->



nfs文件系统的难题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


nfs文件系统的难题
发表于:2007-09-19 16:13:08 楼主
情况是这样的:
        我把远端的nfs文件系统mount到本地,调用read(...)读一个磁盘文件,当网络不通时(比如我拔掉网线),程序就一直堵在那了不能往下执行,相当于进程挂起转入sleep状态,可是当重新插上网线程序又能继续接着往下执行了,请问各位大侠,在这种情况下有没有办法让nfs文件系统返回一个信号使得程序返回,或者判断timeout就返回,还是需要修改nfs文件系统?谢谢!
发表于:2007-09-19 20:56:351楼 得分:0
如果要快点,还是在应用上想办法,虽然费事,“或者判断timeout就返回”我觉得比较简单的,如吧read(...)做个专用线程,到一定时间没有返回信号就把read(...)的线程给kill了
发表于:2007-09-19 23:41:522楼 得分:0
read前先select,select里面可以设置超时时间。
发表于:2007-09-20 08:56:013楼 得分:0
我就是在read前先select的呀,程序如下:
        if((fd   =   open("/mnt/nfs/movie/corvette.mpg",   o_rdonly   ¦   o_nonblock))   <   0)   {
printf("can't   open   the   file!\n");
return   0;
        }

        while(1)   {
fd_zero(&rfds);
fd_set(fd,   &rfds);

tv.tv_sec   =   5;
tv.tv_usec   =   0;
                select(fd+1,   &rfds,   null,   null,   &tv);

if(fd_isset(fd,   &rfds))   {
        len   =   read(fd,   buf,   1);
        if(len   >   0)   {
                                printf("buf   =   0x%x\n",   buf[0]);
                        }   else   if(len   ==   0)   {   //to   end   of   file
                                lseek(fd,   0,   seek_set);   //move   to   file   head
                        }   else   {
                                printf("failed   to   read   ...\n");
                                break;
                        }
}   else   {
        printf("no   data   within   5   seconds!\n");
        break;
}
        }
当我把网线拔掉,程序就停留在read那里了,select也无法判断到超时;重新插上网线,程序又能继续接着执行。。。
发表于:2007-09-20 09:47:504楼 得分:0
if(fd_isset(fd,   &rfds))   {  
        len   =   read(fd,   buf,   1);  

建议在read   之前   写个printf测试一下,看看如果不来数据的时候是否停在select那里。
发表于:2007-09-20 15:56:125楼 得分:0
if(fd_isset(fd,   &rfds))   {  
        printf("before   read...\n");
        len   =   read(fd,   buf,   1);  
        if(len   >   0)   {  
                printf("buf   =   0x%x\n",   buf[0]);  
                printf("after   read...\n");
        }   else   if(len   ==   0)   {   //to   end   of   file  
                lseek(fd,   0,   seek_set);   //move   to   file   head  
        }   else   {  
                printf("failed   to   read   ...\n");  
                break;  
        }  
}
拔掉网线后,程序打印出"before   read...",就停在read那里了
发表于:2007-09-21 09:32:126楼 得分:0
那可以在   read   前再做一条判断,rd是否可读。
发表于:2007-09-24 15:19:357楼 得分:0
拔掉网线后,fd肯定读不了,但是调用read时底层文件系统还在一直读,直到有数据返回,因此造成这种情况...


快速检索

最新资讯
热门点击