Reputation: 23
I have a file descriptor >0 for a file that is already opened. I want to add a second file descriptor to that file. I know this is possible if I open the file with the second file descriptor again but the problem is that in that point of my code I don't know the name of the file.
So I was wondering if I can just do that: fd2 = fd1;
Upvotes: 1
Views: 384
Reputation: 58524
You may duplicate the file descriptor, returning a new, distinct handle to the same open file description, with either dup
#include <unistd.h>
int fd2 = dup(fd1);
or with fcntl
/F_DUPFD
#include <fcntl.h>
int fd2 = fcntl(fd1, F_DUFPD, 0); // consider F_DUPFD_CLOEXEC !
Because fd2 and fd1 now refer to the same open file description, they "share" certain attributes of the underlying open file description:
struct flock
locks)If you change one of the above on fd2, that change will be visible in fd1 since, again, both refer to the same underlying I/O construct. The same thing happens when file descriptors are duplicated across processes ("inherited").
The descriptors themselves have only one interesting attribute of their own, FD_CLOEXEC, which controls whether or not the descriptor will be preserved (inherited) across an execve
call. This may differ for each descriptor.
Upvotes: 1