/proc/[pid]/fd/[0, 1, 2]: 해당 파일이나 장치가 없습니다 - 파일이 존재하더라도

/proc/[pid]/fd/[0, 1, 2]: 해당 파일이나 장치가 없습니다 - 파일이 존재하더라도

stdio상위 프로세스 외부에서 프로세스의 스트림에 액세스 하려고 합니다 . 디렉토리 를 찾았 /proc/[pid]/fd지만 시도하면

$ cat /proc/[pid]/fd/1

오류 가 발생합니다 No such file or device. Dolphin(파일 브라우저)이 보여주는 것처럼 나는 그것이 존재한다고 확신합니다.

나는 또한 파일 탐색기가 다음과 같이 나열되어 있음을 발견했습니다.소켓제안된 대로 읽어 보세요.여기비슷한 오류가 발생합니다. stdio스트림은 일반적으로 소켓이 아닌 파이프이므로 여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다 .

sudo또한 이러한 프로세스는 동일한 사용자에 의해 시작되었으며 이에 액세스하려고 해도 작동하지 않는다는 점을 지적하고 싶습니다 . 이 질문이 순진해 보인다면 사과드립니다. 하지만 조언을 해주시면 진심으로 감사하겠습니다. stdio 파이프에 액세스하는 더 좋은 방법이 있을까요?

답변1

너무 길어요 박사님;2020년 현재 /proc/<pid>/fd/<fd>소켓인 경우에는 이 작업(또는 이와 유사한 작업)을 수행할 수 없습니다.

프로세스의 stdin, stdout 및 stderr은 파이프, 일반 파일 등이 아닌 모든 유형의 파일일 수 있습니다. 소켓이 될 수도 있습니다.

Linux에서는 /proc/<pid>/fd/<fd>다음을 열 수 있는 특별한 기호 링크입니다.처음부터 시작하세요이 작업은 파일이 삭제되었거나 파일 시스템에 전혀 존재하지 않는 경우에도(예: 생성된 파일 사용 memfd_create(2)) 파일 설명자가 참조하는 실제 파일에 대해 수행됩니다.

그러나 소켓은 주목할만한 예외이며, 이런 방식으로 열 수 없습니다. (그리고 이를 구현하는 방법은 명확하지 않습니다. 해당 fd가 연결된 소켓인 경우 서버에 대한 다른 연결을 생성합니까? 소켓이 명시적 open()으로 /proc/<pid>/fd/<fd>로컬 포트?).

최신 버전의 Linux 커널에는 새로운 시스템 호출이 도입되었습니다.pidfd_getfd(2), 이는 Unix 소켓을 통해 파일 설명자를 전달할 수 있는 것처럼 다른 프로세스에서 파일 설명자를 "훔칠" 수 있지만 피해자 프로세스의 협력 없이 가능합니다. 그러나 이것은 아직 대부분의 Linux 배포판에서 구현되지 않았습니다.

관련 정보