이 작업을 수행하면(Bourne과 같은 쉘에서):
exec 3> file 4>&3 5> file 6>> file
파일 디스크립터 3과 4는 dup()
3에서 4가 편집되었기 때문에 동일함을 공유합니다.파일 설명 열기(동일한 속성, 파일 내의 동일한 오프셋...). 프로세스의 파일 설명자 5와 6은 다른 위치에 있지만파일 설명 열기(예를 들어, 모두 파일에 자체 포인터가 있습니다.)
이제 lsof
출력에서 볼 수 있는 내용은 다음과 같습니다.
zsh 21519 stephane 3w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG 254,2 0 10505865 /home/stephane/file
다음 방법을 사용하는 것이 좋습니다 lsof +fg
.
zsh 21519 stephane 3w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG W,AP,LG 254,2 0 10505865 /home/stephane/file
(Linux 3.16에서) fd 6에는 다른 플래그가 있으므로 달라야 합니다.파일 설명 열기하나는 fd 3, 4 또는 5에 있지만 이것으로는 fd 5가 다른 위치에 있다는 것을 알 수 없습니다.파일 설명 열기. 를 사용하면 -o
오프셋도 볼 수 있지만 동일한 오프셋이 동일하다고 보장하지는 않습니다.파일 설명 열기.
비침습적 으로 알아낼 수 있는 방법이 있나요 ? 외부인가요, 아니면 프로세스 자체의 파일 설명자인가요?
1. 한 가지 경험적 방법은 하나의 파일 설명자의 플래그를 변경 fcntl()
한 다음 결과적으로 다른 파일 설명자의 플래그가 업데이트되는지 확인하는 것일 수 있지만 이는 확실히 이상적이거나 완벽한 방법은 아닙니다.
답변1
Linux 3.5 이상의 경우 다음을 수행할 수 있습니다.kcmp(2):
KCMP_FILE
매뉴얼 페이지는 OP가 요청한 사용 사례에 대한 구체적인 예를 제공합니다. 이 시스템 호출을 수행하려면 커널을 set 으로 컴파일해야 합니다 CONFIG_CHECKPOINT_RESTORE
.
답변2
비교하는 것은 struct file
파일 설명자가 가리키는 포인터입니다. (커널 내부에는 task_struct
스레드당 데이터 구조가 있습니다. 여기에는 이라는 다른 구조에 대한 포인터가 포함되어 있습니다 files_struct
. 그리고저것이 구조에는 각각 하나를 가리키는 포인터 배열이 포함되어 있으며 검색 오프셋, 공개 플래그 및 기타 필드를 보유하고 struct file
있습니다 . struct file
)
files_struct
일부 침입적인 도구를 사용하는 것 외에는 사용자가 포인터를 볼 수 있는 방법을 모릅니다. 예를 들어 SystemTap에 PID가 제공되면 해당 PID를 찾아 task_struct
포인터를 따라갈 수 있습니다. 하지만 패시브를 찾고 있다면 이것이 바로 그것이라고 생각합니다. Dell에서 도구 출시긴얼마 전까지만 해도 KME(커널 메모리 편집기)로 알려진 이 프로그램은 원하는 작업을 수행할 수 있는 실시간 커널 메모리용 스프레드시트와 유사한 인터페이스를 제공했지만 64비트로 이식된 적은 없습니다. (시도해 보았지만 제대로 작동하지 않았으며 이유는 모르겠습니다.)
도움 이 되지 않을 것이라고 생각하는 이유 중 하나 lsof
는 해당 포인터도 표시되지 않기 때문입니다(그러나 +f
Linux가 아닌 시스템에 대한 옵션을 확인하십시오). 이론적으로는 모든 필드를 비교 struct file
하고 두 구조가 동일한 것으로 간주할 수 있지만 여전히 별도의 open(2)
호출에서 나올 수 있습니다.
보세요p 파일SystemTap 스크립트 아이디어. 주소를 인쇄하도록 수정하면 struct file
해결 방법을 얻을 수 있습니다. 당신은 또한 확인할 수 있습니다_pid.stp로 열린 파일그 안에는 순회할 수 있는 함수가 있기 때문 files_struct
입니다. 파일 설명자 테이블, struct file
객체 보기...
당신이 달성하고 싶은 것이 무엇인지 물어봐도 될까요?
답변3
다음은 Linux 관련 솔루션입니다. /proc/self/fd는 현재 프로세스에서 파일 핸들을 여는 심볼릭 링크 디렉터리입니다. 링크 값을 비교하면 됩니다. 하위 프로세스를 사용하면 하위 프로세스가 pid 종속 심볼릭 링크이기 때문에 다른 /proc/self를 가지게 되므로 더 복잡해집니다. /proc/$$/fd를 사용하여 이 문제를 해결할 수 있습니다. 여기서 $$는 원하는 pid입니다.