【问题标题】:open(2) a file from existing descriptor打开(2)来自现有描述符的文件
【发布时间】:2023-02-03 12:53:44
【问题描述】:

背景

我在同一个进程中有多个线程,它们都在给定文件上安装 fcntl(2) 锁。这些锁必须阻塞,因此要实现进程内阻塞,我必须使用打开文件描述锁(或 OFD 锁,请参阅fcntl(2))。据记载:

通过同一打开文件放置的打开文件描述锁 描述(即通过相同的文件描述符,或通过 fork(2)、dup(2) 创建的文件描述符的副本, fcntl() F_DUPFD 等)总是兼容的:如果一个新锁 被放置在一个已经锁定的区域,那么现有的锁是 转换为新的锁类型。 (此类转换可能会导致 使用现有锁拆分、收缩或合并 上面讨论过。)

另一方面,打开的文件描述锁可能与 通过不同的打开文件获取时彼此 说明。就这样多线程程序中的线程可以 使用打开的文件描述锁来同步对文件的访问 通过让每个线程执行自己的 open(2) 区域在文件上 并通过生成的文件描述符应用锁。

因此,当一个线程启动时,它必须通过open 打开它自己的描述符。应该注意的是,“主线程”已经打开了文件,线程在整个进程生命周期中来来去去。

问题

所以我在想,有没有什么办法可以重新使用现有的文件描述符来打开一个单独的描述符到同一个文件而不需要dup(2)

换句话说,如果我有文件描述符一种, 但不知道文件名,我可以打开描述符吗指向同一个文件一种是?

【问题讨论】:

    标签: c linux multithreading fcntl


    【解决方案1】:

    我的第一直觉如下,而 fd 是原始文件描述符,而 fd2 是“深度克隆”描述符。

    char buff[500]
    sprintf(buff, "/proc/%d/fd/%d", getpid(), fd);
    fd2 = open(buff, O_RDWR)
    

    但是,感觉很脏。我希望有一个系统调用来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多