/ proc / <pid> / exe 심볼릭 링크는 일반 심볼릭 링크와 어떻게 다릅니 까? & [1] 13728 $ rm sleep $

프로세스를 시작한 다음 이진 파일을 삭제해도 다음에서 복구 할 수 있습니다 /proc/<pid>/exe.

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link

반면에 직접 심볼릭 링크를 만들면 대상을 삭제하고 복사를 시도하십시오.

cp: cannot stat ‘sleep’: No such file or directory

/proc커널에 대한 인터페이스입니다. 그렇다면이 심볼릭 링크는 실제로 메모리에로드 된 사본을 가리 키지 만보다 유용한 이름이 있습니까? 어떻게합니까 exe링크 작업은 정확히?



답변

/proc/<pid>/exe심볼릭 링크의 일반 의미를 따르지 않습니다. 기술적으로 이것은 POSIX 위반으로 간주 될 수 있지만 결국 /proc특별한 파일 시스템입니다.

/proc/<pid>/exe당신이 stat그것을 할 때 심볼릭 링크 인 것처럼 보입니다 . 이것은 커널이 프로세스 실행 파일에 대해 알고있는 경로 이름을 내보내는 편리한 방법입니다. 그러나 실제로 “파일”을 열면 다음 심볼릭 링크 내용을 읽는 일반적인 절차는 없습니다. 대신 커널은 열린 파일 항목에 직접 액세스 할 수 있습니다.

공지 사항 그 때 실행 된 심볼릭 링크의 대상을 삭제 그것의 끝에 “(삭제)”문자열을 가진 프로세스에 대한 가상 파일 (pseudofile). 이것은 일반적으로 심볼릭 링크에서 무의미합니다. 대상 경로에 “(삭제됨)”으로 끝나는 이름의 파일이있는 파일은 없습니다.ls -l/proc/<pid>/exe

TL; DRproc 파일 시스템 구현은 단지 경로 해상도 자신의 마법의 일을한다.


답변

/ proc의 man 페이지에 따르면 Linux 2.2 이상에서 파일은 실행 된 명령의 실제 경로 이름을 포함하는 기호 링크입니다. 분명히, 바이너리 메모리,에로드 /proc/[pid]/exe바이너리의 내용에 지점 메모리 .

반면, Linux 2.0 및 이전 버전에서는 실행 된 파일 (파일 시스템의)에 /proc/[pid]/exe대한 포인터 입니다.

따라서 Linux 2.0 또는 이전 버전에서 동일한 명령 목록을 실행 한 경우 “해당 파일이나 디렉토리가 없습니다”라는 오류가 표시 될 수 있습니다.


답변