C 将硬安装的NFS卷视为软卷

C 将硬安装的NFS卷视为软卷,c,linux,nfs,C,Linux,Nfs,我正在为Linux编写一个C程序,用于读取和写入NFS服务器上的文件。这一份额增长缓慢;访问它的尝试将被无限期阻止,直到它们工作为止。无限期地使用我的程序块是不好的;即使文件不可用,它仍然能够执行有用的工作。重新安装共享软件不是一种选择 有两个进程,其中一个可以工作并且不会阻塞,另一个可以处理文件IO并且可能会阻塞,这是一个选项,但将构成一个重大更改。我想避免这样。真的,我想说,“我知道你是硬装的,这样天真的程序就可以假装你是一个高度可靠的本地磁盘。但我更清楚,我准备好应对任何访问失败,类似于软

我正在为Linux编写一个C程序,用于读取和写入NFS服务器上的文件。这一份额增长缓慢;访问它的尝试将被无限期阻止,直到它们工作为止。无限期地使用我的程序块是不好的;即使文件不可用,它仍然能够执行有用的工作。重新安装共享软件不是一种选择

有两个进程,其中一个可以工作并且不会阻塞,另一个可以处理文件IO并且可能会阻塞,这是一个选项,但将构成一个重大更改。我想避免这样。真的,我想说,“我知道你是硬装的,这样天真的程序就可以假装你是一个高度可靠的本地磁盘。但我更清楚,我准备好应对任何访问失败,类似于软装的行为。”因此:

在C语言中,如何访问硬安装的NFS共享上的文件,如果服务器不可用而不是无限期地阻塞,则会出现错误

如有必要,我可以作为root运行,但我不希望这样。使用root重新装载共享是正确的。我可以依赖新功能,但越是支持后台,效果越好


我的研究表明答案是这是不可能的,但也许我遗漏了什么。

如果您没有遗漏任何内容,您将永远不会收到服务器不可用的错误,因为内核永远不会在硬安装的nfs装载点上提供这些错误

因为硬选项是挂载点的属性,所以您不能让应用程序进行挑选,因为内核没有设置为以这种方式运行


但是,您提到可以以root用户身份运行应用程序。为什么不将文件系统装载到其他软件上,然后获得您预期的行为?

如果您没有遗漏任何内容,您将永远不会收到服务器不可用错误,因为内核永远不会在硬装载的nfs装载点上交付这些错误

因为硬选项是挂载点的属性,所以您不能让应用程序进行挑选,因为内核没有设置为以这种方式运行


但是,您提到可以以root用户身份运行应用程序。为什么不将文件系统装载到其他软件上,然后获得您预期的行为?

如果您没有遗漏任何内容,您将永远不会收到服务器不可用错误,因为内核永远不会在硬装载的nfs装载点上交付这些错误

因为硬选项是挂载点的属性,所以您不能让应用程序进行挑选,因为内核没有设置为以这种方式运行


但是,您提到可以以root用户身份运行应用程序。为什么不将文件系统装载到其他软件上,然后获得您预期的行为?

如果您没有遗漏任何内容,您将永远不会收到服务器不可用错误,因为内核永远不会在硬装载的nfs装载点上交付这些错误

因为硬选项是挂载点的属性,所以您不能让应用程序进行挑选,因为内核没有设置为以这种方式运行


但是,您提到可以以root用户身份运行应用程序。为什么不将文件系统安装到其他软件上,然后获得预期的行为?

为什么不设置一个超时信号,在适当的超时后中断阻塞调用。每当您执行阻塞调用(
open()
fopen()
readdir()
chdir()
stat()
,等等)时启动计时器,如果调用返回时带有
errno==EINTR
,并且超时信号处理程序设置了一个标志,则可以判断调用没有在分配的时间内进行,把它当作电话出错一样对待。超时信号处理的额外开销是值得的;这是Apache等服务器软件的常见做法。将超时设置为用户可配置,然后就可以设置了。这是一个潜在的解决方法。这可靠吗?我相信一个不可用的NFS挂载可能会使进程进入不可中断的休眠状态,信号本身会阻止它。2.6.25之前的内核
nointr
mount选项确实使其可靠,但在以后的内核上会被忽略
SIGKILL
是唯一有效的方法。因此,您需要使用子进程来访问装载,通过Unix域套接字辅助消息返回描述符(文件或目录)。如果操作花费的时间太长,原始进程将使用超时来杀死子进程。使用长寿命的最小子级,为每个操作派生一个子级,可以将开销降低到可接受的水平。可能在每次访问之前解析
/proc/mounts
,也只能在NFS周围工作。实际上,您必须让子(或子子)提供数据流,因为文件系统可能随时无法访问。仅仅提供描述符就可以保护打开,而不是访问,避免陷入不间断睡眠。另外,超时会稍微复杂一些:一个用于初始访问,另一个用于每个数据包。为什么不设置一个超时信号,在适当的超时后中断阻塞调用呢。每当您执行阻塞调用(
open()
fopen()
readdir()
chdir()
stat()
,等等)时启动计时器,如果调用返回时带有
errno==EINTR
,并且超时信号处理程序设置了一个标志,则可以判断调用没有在分配的时间内进行,把它当作电话出错一样对待。超时信号处理的额外开销是值得的;这是Apache等服务器软件的常见做法。将超时设置为用户可配置,然后就可以设置了。这是一个潜在的解决方法。这可靠吗?我相信一个不可用的NFS挂载可能会使进程进入不可中断的休眠状态,信号本身会阻止它。2.6.25之前的内核
nointr
mount选项确实会使