/ / ¿Qué sucede realmente si elimina el directorio de trabajo, cómo lo maneja el kernel? - linux, unix, descriptor de archivo, cd, current-dir

¿Qué sucede realmente si elimina el directorio de trabajo, cómo lo maneja el kernel? - linux, unix, file-descriptor, cd, current-dir

He tratado de encontrar esta respuesta en todo SO, pero no encontré una. Tomemos un ejemplo primero:

$ cd /tmp
$ mkdir foo
$ cd foo
$ pwd
/tmp/foo
$ $SHELL
$ rmdir /tmp/foo
$ exit
$ pwd
/tmp/foo
$ ls
<no output>
$ man ls
man: can"t change directory to "": No such file or directory
man: command exited with status 255: (cd  && LESS=-ix8RmPm Manual page ls(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB%.. (press h for help or q to quit)$PM Manual page ls(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB%.. (press h for help or q to quit)$ MAN_PN=ls(1) pager -s)
$ echo -e "#include<unistd.h>n#include<stdio.h>n#include<stdlib.h>nint main(){char*p=getcwd(NULL,0);printf("%s\n",p);free(p);}" | gcc -x c -
/usr/bin/ld: cannot open output file a.out: No such file or directory
collect2: error: ld returned 1 exit status
$ cd $PWD
cd: no such file or directory: /tmp/foo

Que esta pasando aqui internamente? ¿Cómo maneja el kernel este tipo de situaciones? Si se supone que el directorio actual permanece como un descriptor de archivo, por qué ¿Todos esos comandos fallan?

Y, (al menos para mí) más importante, ¿por qué hay no ¿Protección contra este tipo de cosas? Me parece que puede conducir a problemas de seguridad graves fácilmente ...

Respuestas

4 para la respuesta № 1

Cuando eliminas un directorio, se llevan a cabo los siguientes pasos:

  • El enlace al directorio en su padre es eliminado.
  • los .. Se elimina el enlace en el directorio a su padre.
  • los . Se elimina el enlace en el directorio a sí mismo

A medida que se produce cada uno de estos, se elimina el recuento de enlaces del directorio. Cuando el recuento de enlaces se convierte en 0, el directorio en sí se elimina del sistema de archivos.

Si hay algún proceso que acceda al directorio (ya sea como un directorio de trabajo o porque han llamado opendir()), estos también aumentarán el número de enlaces del directorio. Por lo tanto, el directorio no desaparece hasta que desaparecen todos estos accesos.

Mientras el directorio está en este estado, se puede leer, pero cualquier cosa que dependa de cualquiera de los enlaces anteriores fallará. Cuando tu lo hagas cd $PWDestá tratando de hacer cd /tmp/foo, pero el foo Se ha eliminado el enlace.