open(2) a file from existing descriptor

71 Views Asked by At

Background

I have multiple threads in the same process that are all installing fcntl(2) locks on a given file. These locks must block, thus to achieve intra-process blocking I must use Open file description locks (or OFD locks, see fcntl(2)). And it is documented that:

Open file description locks placed via the same open file description (i.e., via the same file descriptor, or via a duplicate of the file descriptor created by fork(2), dup(2), fcntl() F_DUPFD, and so on) are always compatible: if a new lock is placed on an already locked region, then the existing lock is converted to the new lock type. (Such conversions may result in splitting, shrinking, or coalescing with an existing lock as discussed above.)

On the other hand, open file description locks may conflict with each other when they are acquired via different open file descriptions. Thus, the threads in a multithreaded program can use open file description locks to synchronize access to a file region by having each thread perform its own open(2) on the file and applying locks via the resulting file descriptor.

Thus, when a thread is booting up, it must open its own descriptor via open. It should be noted that the "main thread" has the file already open and threads come and go throughout the processes lifetime.

Question

So I was thinking, is there any way I can re-use an existing file descriptor to open a separate descriptor to the same file without dup(2)?

In otherwords, if I had file descriptor A, but do not know the filename, can I open descriptor B pointing to that same file A is?

1

There are 1 best solutions below

0
Sanchke Dellowar On

My first instinct is as follows, whereas fd is the original file descriptor and fd2 is the "deep cloned" descriptor.

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

However, it feels dirty. I was hoping there is a system call to do this.