I think that my program leaves one open file descriptor.
int main()
{
int my_fd = dup(STDOUT_FILENO);
char *cmd[2];
cmd[0] = "/bin/ls";
cmd[1] = NULL;
dprintf(2, "pid = %d\n", getpid());
if (fork() != 0)
{
// close(my_fd);
waitpid(-1, NULL, WUNTRACED);
}
else
{
dup2 (my_fd, STDERR_FILENO);
// close(my_fd);
execve(cmd[0], cmd, NULL);
}
}
The output of the program is:
pid = 8718
myprog myprog.c
I'd like to see this file descriptor with lsof or another command, I don't see it
I've tried to find similar questions on stackoverflow.
I've tried lsof -c myprog
, it shows nothing.
I've tried lsof | grep myprog
, it shows :
bash 7020 an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
cpptools 7393 an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
cpptools 7393 7395 cpptools an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
cpptools 7393 7396 cpptools an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
cpptools 7393 7397 cpptools an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
cpptools 7393 7398 cpptools an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
...
etc
I've tried ls -l /proc/$$/fd
, it shows
lrwx------ 1 an an 64 oct. 29 23:00 0 -> /dev/pts/0
lrwx------ 1 an an 64 oct. 29 23:00 1 -> /dev/pts/0
lr-x------ 1 an an 64 oct. 29 23:00 103 -> /snap/code/143/usr/share/code/v8_context_snapshot.bin
lrwx------ 1 an an 64 oct. 29 23:00 2 -> /dev/pts/0
lrwx------ 1 an an 64 oct. 29 23:00 255 -> /dev/pts/0
l-wx------ 1 an an 64 oct. 29 23:00 36 -> /home/an/.config/Code/logs/20231029T225917/ptyhost.log
lrwx------ 1 an an 64 oct. 29 23:00 37 -> 'socket:[69635]'
lr-x------ 1 an an 64 oct. 29 23:00 38 -> /snap/code/143/usr/share/code/resources/app/node_modules.asar
I've tried lsof -a -p $$
, it shows:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 7020 an cwd DIR 9,0 4096 7082347 /mnt/md0/42/myprog
bash 7020 an rtd DIR 8,20 4096 2 /
bash 7020 an txt REG 8,20 1183448 5245518 /usr/bin/bash
bash 7020 an mem REG 8,20 183318 6030673 /usr/share/locale-langpack/fr/LC_MESSAGES/bash.mo
bash 7020 an mem REG 8,20 51856 5249542 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so
bash 7020 an mem REG 7,4 340640 187 /snap/code/143/usr/lib/locale/aa_DJ.utf8/LC_CTYPE
bash 7020 an mem REG 7,4 2586930 186 /snap/code/143/usr/lib/locale/aa_DJ.utf8/LC_COLLATE
...
etc
I've tried ls -l /proc/8718/fd
, it answers:
ls: impossible d'accéder à '/proc/8718/fd': Aucun fichier ou dossier de ce type
Both your parent and child processes are exiting very quickly (i.e., before you have time to run any of the commands you tried). When a process exits1, all of its remaining open file descriptors are automatically closed by the kernel. If you want to have time to see them open, pick a longer-running command, e.g.:
char *cmd[3];
cmd[0] = "/bin/sleep";
cmd[1] = "60";
cmd[2] = NULL;
1: Shenanigans with CLONE_FILES
can change this. A more technically correct statement would be "when all threads with a given file descriptor table exit, all of the remaining file descriptors in that table are closed."