스레드 ID를 사용하지 않고 열린 파일 설명자를 어떻게 표시할 수 있습니까 lsof
? 비슷한 질문이 있다는 것을 알고 있지만 답변에 스레딩 세부 정보가 포함되어 있지 않습니다.
답변1
주어진 답변 외에도 Linux에서는 프로세스에 의해 시작된 모든 스레드가 일반적으로 동일한 파일 설명자 세트를 공유한다는 점을 언급할 가치가 있습니다. 따라서 둘 다:
ls /proc/$parent_pid/task/$task/fd
그리고
ls /proc/$parent_process/fd
일반적으로 동일한 출력을 생성합니다. 즉, 하위 프로세스는 상위 프로세스에서 참조하는 파일 설명자를 상속합니다. "lsof" 매뉴얼은 실제로 -K 옵션 문서에서도 이를 지정합니다:
"일반적으로 스레드와 작업은 호출자의 파일을 상속하지만 일부 파일은 닫고 다른 파일은 열 수 있으므로 lsof는 항상 스레드와 작업에 대해 열려 있는 모든 파일을 보고합니다."
따라서 잠재적인 모호함(이전 답변으로 인해 생성되었을 수 있음)을 제거하기 위해 목록은 /proc/$parent_pid/$task/fd
$task가 해당 디렉터리의 파일 설명자 ID를 참조하는 스레드임을 보장하지 않습니다. 특정 파일 설명자가 열려 있는 스레드를 알 수 있는 안정적인 방법이 필요한 경우 커널이 파일 설명자를 할당하도록 요구하는 것과 같은 strace
시스템 호출을 프로그램에서 추적 하도록 할 수 있습니다.open()
답변2
리눅스의 경우:
ls -l /proc/*/task/*/fd
대조적으로 lsof
, 매핑된 파일, 루트 디렉터리 및 현재 디렉터리가 아닌 파일 설명자만 나열합니다.
답변3
글쎄, 당신은 그것을 확인할 수 있습니다. /proc/TID/fd....
여기서 문제가 무엇인지 이해하지 못합니다.