gpt4 book ai didi

unix - 如何在两个进程之间安全地共享文件描述符?

转载 作者:行者123 更新时间:2023-12-02 21:57:40 24 4
gpt4 key购买 nike

这是一个后续问题,以 UNIX 为中心,到 my previous question here .

我想知道进程打开的文件描述符是否可以安全地用于 fork 进程。

我通过同时运行数百个进程来运行一些测试,所有进程都连续写入同一个文件描述符。我发现:

  • fwrite() 调用达到 8192 字节时,所有调用都被完美序列化并且文件正常。
  • fwrite() 调用超过 8192 字节时,字符串被分成 8192 字节的 block ,这些 block 随机写入文件,最终损坏。

我尝试使用 flock(),但没有成功,因为每个进程都试图锁定/解锁相同的文件描述符,这没有意义。结果是一样的。

有没有办法在所有进程之间安全地共享文件描述符,并使所有 fwrite() 调用正确序列化?

最佳答案

首先需要注意的是stdio缓冲区。因为您使用的是 stdio (fwrite()) 而不是系统调用 directlr (write()),所以您不知道数据何时会真正刷新到文件中.要绕过这个问题,您必须在每次释放锁之前刷新关键部分内的 stdio 缓冲区:

take the lock
fwrite(foo, ...);
fflush(thefile);
release the lock

...或者您可以切换到直接使用 write()

现在,回到主要问题:如何锁定文件,以便一次只有一个进程可以独占访问该文件。

您可能会也可能不会使用 flock()。这取决于不同进程如何获取同一文件的文件描述符。 flock() 锁与打开的文件表条目相关联。因为 fork()dup() 创建了引用相同文件表条目的新文件描述符,所以它们是来自 flock() 的观点,所以在这种情况下你不能使用 flock()。另一方面,如果每个进程直接使用 open() 打开自己的文件副本,那么您可以使用 flock()

fcntl() 风格的锁定不会遇到这个问题(它会遇到不同类型的问题!)。 fcntl() 锁是针对每个进程的,因此进程如何获取同一文件的文件描述符并不重要。

所以我建议您尝试使用 fcntl() 样式的锁定:

struct flock ll;

/* lock */
ll.l_start = ll.l_len = ll.l_whence = 0; /* lock the whole file */
ll.l_type = F_WRLCK; /* exclusive lock */
fcntl(fd, F_SETLKW /* or F_SETLK */, &ll);

/* unlock */
ll.l_type = F_UNLCK;
fcntl(fd, F_SETLKW /* or F_SETLK */, &ll);

关于unix - 如何在两个进程之间安全地共享文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com