首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程和共享文件描述符

进程和共享文件描述符
EN

Stack Overflow用户
提问于 2015-06-29 01:28:16
回答 2查看 813关注 0票数 0

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

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

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

那么我的问题是正确的吗?我的第二个问题是,假设有多个进程需要写入这个日志文件,那么我该如何重新实现这个方法。是否每个进程都需要打开该文件..还是有其他更有效的方法..我是否需要关闭该文件,以便其他进程可以打开并写入该文件?

编辑:

该软件是一个名为filebench的开源软件。可以通过here查看该文件。

日志方法为filebench_log。204行是我提到的打开文件的第一个检查。写入发生在第293行。在所有进程中,fd值为11,并且该值相同:11。它实际上是由所有进程共享的,并且设置主要是here。该文件只打开一次(通过print语句验证)。

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

代码语言:javascript
复制
filebench_shm 

fd是

代码语言:javascript
复制
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是不同的:

代码语言:javascript
复制
/proc/101/fd/11 
/proc/102/fd/11

我有一个在这些进程之间共享的数据结构。有没有其他方法可以在他们之间共享打开的文件,而不是fd,因为那不起作用?

EN

回答 2

Stack Overflow用户

发布于 2015-06-29 01:49:19

在产生新进程之前打开文件似乎是最简单的。这通过将文件集中到一个时间和位置,避免了有关打开文件的所有协调复杂性。

票数 3
EN

Stack Overflow用户

发布于 2015-06-29 01:43:36

我最初写这篇文章是为了解决这个问题:

  • 创建一个共享内存段。
  • 将文件描述符变量放在段中。
  • 在段中放一个互斥信号量
  • 每个进程都会访问段中的文件描述符。如果它没有打开,锁定信号量,检查它是否打开,如果没有打开文件。释放互斥锁。

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

但这假设底层文件描述符对象也在共享内存中,但我认为不是。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31102639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档