繁体   English   中英

进程和共享文件描述符

[英]Processes and a shared file descriptor

我有一个创建自己的多个实例(进程)的应用程序,并且这些进程具有共享的数据结构。 在该结构中,有一个文件描述符,用于将数据记录到文件中。 日志记录功能中有一项检查,检查文件描述符是否为-1,如果为-1,则打开文件并设置共享文件描述符的值。

其他进程/线程执行相同的检查,但是此时fd为!= -1。 因此,该文件不会打开。 然后,他们继续写入文件。 大部分时间写入失败,并返回-1。 当写入没有失败时,我使用readlink检查了fd的文件路径。 路径是日志文件以外的其他文件。

我假设这是因为即使文件描述符值始终为11,即使在随后的运行中,该值也为每个进程引用了一个不同的文件。 那么这是进程打开的第十一个文件吗? 因此,对于这些进程,日志文件甚至都不被认为是打开的,即使它们确实打开了文件,fd也会有所不同。

所以我的问题是正确的吗? 我的第二个问题是,鉴于需要多个进程写入此日志文件,我该如何重新实现此方法。 是每个进程都需要打开该文件..还是有另一种更有效的方法..我是否需要关闭文件,以便其他进程可以打开和写入文件。

编辑:

该软件是一个名为filebench的开源软件。 该文件可以在这里看到。

日志方法是filebench_log。 204行是我提到的打开文件的第一个检查。 写操作发生在第293行。fd值在所有进程中均为11,并且该值相同:11.实际上,在所有进程和设置中它实际上都在此处共享。 该文件仅打开一次(通过打印语句验证)。

具有fd的共享数据结构称为

filebench_shm 

而FD是

filebench_shm->shm_log_fd 

编辑2:我得到的错误消息是错误的文件描述符。 Errno是9。

编辑3:因此,似乎每个进程都有fds不同的索引表。 维基:

On Linux, the set of file descriptors open in a process can be accessed under the path /proc/PID/fd/, where PID is the process identifier.

因此,我遇到的问题是,对于具有进程ID 101、102的两个进程,文件描述符11对于两个进程是不同的:

/proc/101/fd/11 
/proc/102/fd/11

我在这些进程之间有一个共享的数据结构..除了fd之外,还有其他方法可以在它们之间共享一个打开的文件吗,因为那不起作用?

在生成新进程之前,打开文件似乎最简单。 这样就避免了通过将文件集中到一个时间和位置来打开文件的所有协调工作。

我最初将其写为解决方案:

  • 创建一个共享内存段。
  • 将文件描述符变量放入段中。
  • 在该段中放置一个互斥量信号灯
  • 每个进程都访问该段中的文件描述符。 如果未打开,请锁定信号量,检查它是否已打开,以及是否未打开文件。 释放互斥锁。

这样,所有进程共享相同的文件描述符。

但这假设基础文件描述符对象也位于共享内存中,我认为并非如此。

相反,请使用其他答案中提到的open then fork方法,或者让每个进程打开文件并在需要时使用flock序列化访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM