【发布时间】:2015-06-28 17:28:16
【问题描述】:
我有一个应用程序,它自己创建多个实例(进程),并且这些进程具有共享的数据结构。在该结构中,有一个文件描述符用于将数据记录到文件中。在日志记录函数中有一个检查,检查文件描述符是否为 -1,如果是,则打开文件并设置共享文件描述符的值。
其他进程/线程执行相同的检查,但此时 fd 为 != -1。所以文件不会被打开。然后他们继续写入文件。大部分时间写入失败并返回 -1。当写入没有失败时,我使用 readlink 检查了 fd 的文件路径。路径是日志文件以外的其他文件。
我假设这是因为即使文件描述符值始终为 11,即使在后续运行中,该值也指向每个进程的不同文件。那么它是进程打开的第十一个文件吗?因此,日志文件甚至不被视为对这些进程打开,即使它们确实打开了文件,fd 也会有所不同。
所以我的问题是正确的吗?我的第二个问题是,鉴于多个进程需要写入此日志文件,我该如何重新实现此方法。每个进程都需要打开该文件吗.. 还是有其他更有效的方法.. 我是否需要关闭该文件以便其他进程可以打开并写入它..?
编辑:
该软件是一个名为filebench的开源软件。 文件可见here。
日志方法是filebench_log。第 204 行是我提到的文件打开位置的第一个检查。写入发生在第 293 行。fd 值在所有进程中为 11,并且值相同:11。它实际上是由所有进程共享的,并且主要是 here。该文件只打开一次(通过打印语句验证)。
具有 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 之外,我还有其他方法可以在它们之间共享打开的文件,因为那不起作用?
【问题讨论】:
-
"大部分时间写入失败并返回 -1" 并且
errno设置为哪个值? -
“创建多个实例”如何?
-
一些代码会有所帮助。但是请注意,除非您将结构放在共享内存中,否则它不在多个进程之间共享。当您生成子进程时,每个子进程都有自己的副本。其他所有内容(假设您通过
fork()ing 启动新副本)。 -
“共享数据结构”怎么样?
-
发生这一切的平台也会很有趣。
标签: c