我有一个应用程序,它创建自己的多个实例(进程),这些进程有一个共享的数据结构。该结构中有一个文件描述符,用于将数据记录到文件中。日志记录函数中有一个检查,它检查文件描述符是否为-1,如果是,则打开文件并设置共享文件描述符的值。
其他进程/线程执行相同的检查,但此时fd是!= -1。这样文件就不会被打开。然后,它们继续写入该文件。写入大部分时间都会失败,并返回-1。当写入没有失败时,我使用readlink检查了fd的文件路径。路径不是日志文件,而是其他文件。
我假设这是因为即使文件描述符值始终为11,即使在随后的运行中,该值也会为每个进程引用不同的文件。所以它是进程打开的第11个文件?因此,对于这些进程,日志文件甚至不被认为是打开的,即使它们确实打开了文件,fd也是不同的。
那么我的问题是正确的吗?我的第二个问题是,假设有多个进程需要写入这个日志文件,那么我该如何重新实现这个方法。是否每个进程都需要打开该文件..还是有其他更有效的方法..我是否需要关闭该文件,以便其他进程可以打开并写入该文件?
编辑:
该软件是一个名为filebench的开源软件。可以通过here查看该文件。
日志方法为filebench_log。204行是我提到的打开文件的第一个检查。写入发生在第293行。在所有进程中,fd值为11,并且该值相同:11。它实际上是由所有进程共享的,并且设置主要是here。该文件只打开一次(通过print语句验证)。
具有fd的共享数据结构称为
filebench_shm fd是
filebench_shm->shm_log_fd 编辑2:我得到的错误信息是Bad file descriptor。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,因为那不起作用?
发布于 2015-06-29 01:49:19
在产生新进程之前打开文件似乎是最简单的。这通过将文件集中到一个时间和位置,避免了有关打开文件的所有协调复杂性。
发布于 2015-06-29 01:43:36
我最初写这篇文章是为了解决这个问题:
这样,所有进程都共享相同的文件描述符。
但这假设底层文件描述符对象也在共享内存中,但我认为不是。
相反,使用另一个答案中提到的open然后fork方法,或者让每个进程打开文件,并在需要时使用flock序列化访问。
https://stackoverflow.com/questions/31102639
复制相似问题