O tty_nr é referenciado em algum outro lugar no procfs do GNU / Linux?

2

Este é um problema que venho tentando resolver sozinho por algum tempo sem qualquer sorte. Estou tentando escrever um script que (entre outras coisas) pode pegar um PID arbitrário e mapeá-lo para o caminho do dispositivo TTY (a função que estou escrevendo retornará "(notty)" se não houver um TTY associado).

Na minha tentativa de fazer o acima, estou tentando usar o tty_nr em / proc / [pid] / stat:

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.)

Eu posso extrair os números maiores e menores, sem problemas. Meu problema entra em cena quando tento traduzi-lo para um caminho de dispositivo: Eu apenas faço um find sob / dev para uma correspondência e aceito a primeira? Existe uma maneira mais elegante de fazer isso?

Eu encontrei isto e parece que o O script python tem algum tipo de mapeamento de números tty_nr para caminhos físicos, mas não consigo encontrar qualquer outra parte do script que realmente preencha essa lista para ver de onde eles estão obtendo seus dados para ver se consigo criar um análogo do Linux. Também é possível que isso dependa de algum BSD-ismo, mas eu encontrei uma parede de tijolos.

Basicamente, estou tentando não iniciar outro processo se puder ajudar. Além disso, toda a abordagem "inicie um processo com um número desconhecido de resultados, mas apenas o primeiro resultado" parece meio que ... kludgy. Como tenho que mostrar esse código para outras pessoas, gostaria de ter uma maneira mais ou menos determinista de realizar isso. Eu gostaria de ter alguma garantia de que se (por algum motivo) existirem vários arquivos de dispositivos abaixo de / dev com esse major / menor (eu sei, mas isso me irritará) que meu código será padronizado para qualquer caminho "oficial" para o TTY é.

É claro que se minhas preocupações com o não-determinismo do método "extrai-e-buscas" forem infundadas, isso seria uma boa notícia, eu gostaria apenas de entender por que elas são infundadas. Tudo mais falha Eu acho que poderia tentar buscas restritas por caminhos comuns (/ dev / pts * / dev / tty * etc) antes de passar para uma varredura de todos os / dev.

    
por Bratchley 21.06.2013 / 14:44

2 respostas

2

Você pode criar o nome "oficial" do número menor e verificar sua existência (e número maior / menor, é claro). Se o número menor for 5, primeiro você verifica se existe tty5 e se possui o mapeamento correto. Se um dos dois falhar, você terá que procurar (e tornar uma política o que deve retornar se houver várias correspondências).

Editar 1:

De Documentation/devices.txt :

3 char Pseudo-TTY slaves
      0 = /dev/ttyp0    First PTY slave
      1 = /dev/ttyp1    Second PTY slave
        ...
    255 = /dev/ttyef    256th PTY slave

    These are the old-style (BSD) PTY devices; Unix98
    devices are on major 136 and above.


4 char  TTY devices
      0 = /dev/tty0     Current virtual console

      1 = /dev/tty1     First virtual console
        ...
     63 = /dev/tty63    63rd virtual console
     64 = /dev/ttyS0    First UART serial port
        ...
    255 = /dev/ttyS191  192nd UART serial port
    
por 21.06.2013 / 14:57
1

Eu posso estar perdendo algo aqui, mas você não pode usar apenas ps ?

tty="/dev/'ps --no-headers -o tty -p pid'"
    
por 21.06.2013 / 14:51