이것은 운이 좋지 않은 채 한동안 스스로 해결하려고 노력한 문제입니다. 임의의 PID를 가져와 이를 TTY 장치의 경로에 매핑할 수 있는 스크립트를 작성하려고 합니다(관련 TTY가 없으면 내가 작성하는 함수는 "(notty)"를 반환합니다). .
위의 작업을 수행하려고 할 때 다음을 사용하려고했습니다.tty_nr/proc/에서[PID]/통계:
tty_nr %d (7) The controlling terminal of the process. (The
minor device number is contained in the
combination of bits 31 to 20 and 7 to 0; the major
device number is in bits 15 to 8.)
문제 없이 기본 및 보조 번호를 가져올 수 있습니다. 내 문제는 장치 경로로 변환하려고 할 때 발생합니다.find
/dev에서만 일치하고 첫 번째 일치를 허용합니까 ? 이를 수행하는 더 우아한 방법이 있습니까?
내가 찾았어이것Python 스크립트에는 tty_nr 번호를 물리적 경로에 매핑하는 일종의 매핑이 있는 것 같지만 실제로 이 목록을 채우는 스크립트의 다른 부분을 찾을 수 없어 데이터를 어디서 가져오는지 확인하고 리눅스 에뮬레이션. 일부 BSD주의에 의존하는 것도 가능하지만 나는 그것에 어려움을 겪고 있습니다.
기본적으로 도움이 될 수 있으면 다른 프로세스를 시작하지 않으려고 노력합니다. 또한 "알 수 없는 수의 결과를 실행하지만 첫 번째 결과만 얻는" 전체 접근 방식은 약간... 투박해 보입니다. 이 코드를 다른 사람들에게 보여줘야 하기 때문에 이 작업을 수행하는 다소 결정적인 방법을 갖고 싶습니다. (어떤 이유로든) /dev 아래에 해당 메이저/마이너가 포함된 여러 장치 파일이 있는 경우(알고 있지만 이는 극단적인 경우이지만 짜증납니다) 내 코드는 기본적으로 TTY의 "공식"이 무엇이든 지정됩니다. 경로는입니다.
물론 추출의 비결정적 특성과 검색 방법에 대한 나의 우려가 근거가 없었다면 좋은 소식이 될 것입니다. 단지 그것이 근거가 없는 이유를 이해하고 싶을 뿐입니다. 다른 모든 방법은 실패했습니다. 모든 /dev를 스캔하기 전에 검색을 일반 경로(/dev/pts* /dev/tty* 등)로 제한해 볼 수 있다고 생각했습니다.
답변1
보조 번호를 기반으로 "공식" tty 이름을 만들고 그것이 존재하는지 확인할 수 있습니다(물론 기본/부 번호와 함께). 마이너 번호가 5인 경우 먼저 tty5가 존재하고 올바른 매핑이 있는지 확인합니다. 이들 중 하나가 실패하면 검색해야 합니다(그리고 일치하는 항목이 여러 개인 경우 무엇을 반환할지 전략을 세워야 합니다).
편집 1:
에서 Documentation/devices.txt
:
3자 의사 TTY 슬레이브 0 = /dev/ttyp0 첫 번째 PTY 슬레이브 장치 1 = /dev/ttyp1 두 번째 PTY 슬레이브 ... 255 = /dev/ttyef 256번째 PTY 슬레이브 이는 레거시(BSD) PTY 장치입니다. 장치는 주로 136 이상입니다. 4자 TTY 장치 0 = /dev/tty0 현재 가상 콘솔 1 = /dev/tty1 첫 번째 가상 콘솔 ... 63 = /dev/tty63 63번째 가상 콘솔 64 = /dev/ttyS0 첫 번째 UART 직렬 포트 ... 255 = /dev/ttyS191 192번째 UART 직렬 포트
답변2
여기에 뭔가 빠진 것 같지만 그냥 사용해도 될까요 ps
?
tty="/dev/`ps --no-headers -o tty -p pid`"