From: Christian KönigSent: 07 May 2024 15:05...I actually have been telling people to (ab)use the epoll behavior to check if two file descriptors point to the same underlying file when KCMP isn't available.In what way?
fd_e = epoll_create1(EPOLL_CLOEXEC);
tmp = dup(fd_A)
epoll_ctl(fd_e, EPOLL_CTL_ADD, tmp, ....);
dup2(fd_B, tmp);
/* If this return -EEXISTS then the fd_A and fd_B are
pointing to the same struct file */
epoll_ctl(fd_e, EPOLL_CTL_ADD, tmp, ....);
close (tmp);
close (fd_e
You can add both fd to the same epoll fd. Relying on the implicit EPOLL_CTL_DEL not happening until both fd are closed is a recipe for disaster. (And I can't see an obvious way of testing it.) Q6/A6 on epoll(7) should always have had a caveat that it is an 'implementation detail' and shouldn't be relied on. (it is written as a 'beware of' ...) The other point is that there are two ways to get multiple fd that reference the same underlying file. dup() fork() etc share the file offset, but open("/dev/fd/n") adds a reference count later and has a separate file offset.
I don't know which structure epoll is using, but I suspect it is the former. So it may not tell you what you want to know. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)