/ / Co się właściwie dzieje, jeśli usuniesz katalog roboczy, w jaki sposób kernel go obsługuje? - linux, unix, deskryptor pliku, cd, current-dir

Co tak naprawdę dzieje się po usunięciu katalogu roboczego, w jaki sposób jądro to obsługuje? - linux, unix, deskryptor pliku, cd, current-dir

Próbuję znaleźć tę odpowiedź na całym SO, ale jej nie znalazłem. Najpierw weźmy przykład:

$ 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

Co tu się dzieje wewnętrznie? W jaki sposób kernel radzi sobie z takimi sytuacjami? Jeśli przypuszcza się, że bieżący katalog pozostaje jako deskryptor pliku, czemu czy wszystkie te polecenia zawodzą?

I (przynajmniej dla mnie), co ważniejsze, dlaczego tak jest Nie ochrona przed tego rodzaju rzeczami? Wydaje mi się, że może to prowadzić do poważnych problemów związanych z bezpieczeństwem ...

Odpowiedzi:

4 dla odpowiedzi № 1

Po usunięciu katalogu mają miejsce następujące kroki:

  • Link do katalogu w katalogu nadrzędnym jest usuwany
  • The .. link w katalogu do jego rodzica jest usuwany
  • The . link w katalogu do siebie jest usuwany

Ponieważ każda z nich ma miejsce, liczba linków do katalogu jest usuwana 0, sam katalog jest usuwany z systemu plików.

Jeśli istnieją jakieś procesy uzyskujące dostęp do katalogu (albo jako katalog roboczy, albo dlatego, że zostały wywołane opendir()), zwiększy to również liczbę linków do katalogu, więc katalog nie zniknie, dopóki wszystkie te odwiedziny nie znikną.

Gdy katalog znajduje się w tym stanie, można go odczytać, ale wszystko, co zależy od któregokolwiek z powyższych łączy, nie powiedzie się. Kiedy to zrobisz cd $PWD, próbuje to zrobić cd /tmp/foo, ale foo link został usunięty.