On Mon, Sep 15, 2014 at 05:11:12PM -0700, Matt Thomas wrote: > > On Sep 15, 2014, at 4:59 PM, Patrick Welche <pr...@cam.ac.uk> wrote: > > > On Tue, Sep 16, 2014 at 12:51:24AM +0100, Justin Cormack wrote: > >> On Tue, Sep 16, 2014 at 12:20 AM, Patrick Welche <pr...@cam.ac.uk> wrote: > >>> Given a filedescriptor, how can you tell that it is valid and has been > >>> opened? > >>> > >>> In the attached simple program, a file and a directory are opened > >>> (with CLOEXEC set). I then call fcntl(fd, F_GETFD) on the range > >>> fd = [3..15]. fd = {3,4} correspond to the open file and directory. > >>> Why don't I get fcntl(4): > >>> > >>> [EBADF] fildes is not a valid open file descriptor. > >>> > >>> for fd = [5..15], but only for some of them? > >>> > >>> $ ./cloexec > >>> fd 3 testfile.txt flags = 0x1 (0x1) > >>> fd 4 testdir flags = 0x1 (0x1) > >>> fd 3's flags = 0x1 (0x1) > >>> fd 4's flags = 0x1 (0x1) > >>> fd 5's flags = 0x0 (0x0) > >>> fd 6's flags = 0x0 (0x0) > >>> fd 7's flags = 0x0 (0x0) > >>> fd 8's flags = 0x0 (0x0) > >>> fd 9's flags = 0x0 (0x0) > >>> fd 10's flags = 0x0 (0x0) > >>> cloexec: fcntl 11: Bad file descriptor > >>> cloexec: fcntl 12: Bad file descriptor > >>> fd 13's flags = 0x0 (0x0) > >>> fd 14's flags = 0x0 (0x0) > >>> cloexec: fcntl 15: Bad file descriptor
> What does fstat show for your shell or add a pause to the program and fstat > it? prlw1 cloexec 2336 wd /home 1424735 drwxr-xr-x 512 r prlw1 cloexec 2336 0 /dev/pts 13 crw--w---- pts/5 rw prlw1 cloexec 2336 1 /dev/pts 13 crw--w---- pts/5 rw prlw1 cloexec 2336 2 /dev/pts 13 crw--w---- pts/5 rw prlw1 cloexec 2336 3 /home 1424738 -rw-r--r-- 0 r prlw1 cloexec 2336 4 /home 1424739 drwxr-xr-x 512 r prlw1 cloexec 2336 5 /usr 7438302 -r--r--r-- 5852 r prlw1 cloexec 2336 6 /usr 7431819 -r--r--r-- 5879 r prlw1 cloexec 2336 7 flags 0x80034<ISTTY,MPSAFE,LOCKSWORK,CLEAN> prlw1 cloexec 2336 8 flags 0x80034<ISTTY,MPSAFE,LOCKSWORK,CLEAN> prlw1 cloexec 2336 9* pipe 0xfffffe814d38cdc0 -> 0x0 w prlw1 cloexec 2336 10 /usr 7439186 -r--r--r-- 58736 r prlw1 cloexec 2336 13 /home 1375614 -rw-r--r-- 18 r prlw1 cloexec 2336 14 flags 0x80024<ISTTY,LOCKSWORK,CLEAN> fd 3 & 4 are intended. Of the other inodes, I only found: fd 10 is /usr/X11R7/lib/X11/fonts/TTF/VeraSeBd.ttf fd 13 is /home/prlw1/.xsmstartup Cheers, Patrick