All'inizio ho provato a risalire qualche xterm
secondo al xterm
pid in base alle informazioni che ho trovato /proc/locks
ma era sciolto. Voglio dire, ha funzionato, penso, ma nella migliore delle ipotesi era circostanziale - non capisco completamente tutte le informazioni fornite dal file e corrispondevo solo a ciò che sembrava corrispondere tra il suo contenuto e i processi terminali noti.
Poi ho provato a guardare lsof/strace
un write/talk
processo attivo tra i pty. Non avevo mai usato nessuno dei due programmi prima, ma sembra che facciano affidamento utmp
. Se il mio pty mirato non aveva una utmp
voce per qualsiasi motivo, entrambi si sono rifiutati di ammettere che esisteva. Forse c'è un modo per aggirare questo, ma ero abbastanza confuso da abbandonarlo.
Ho provato alcune udevadm
scoperte con i nodi dei dispositivi con il numero maggiore di 136 e 128 come pubblicizzato pts
e ptm
rispettivamente in /proc/tty/drivers
, ma mi manca anche qualche esperienza molto utile con quello strumento e ancora una volta non ho riscontrato nulla di sostanziale. È interessante notare, tuttavia, che ho notato che l' :min
intervallo per entrambi i tipi di dispositivo era elencato in modo impressionante 0-1048575
.
Non è stato fino a quando non ho rivisitato questo documento del kernel che ho iniziato a pensare al problema in termini di mount
s, però. L'avevo letto diverse volte prima, ma quando la continua ricerca in quella linea mi ha portato a questo patchset del 2012,/dev/pts
ho avuto un'idea:
sudo fuser -v /dev/ptmx
Ho pensato cosa dovrei usare di solito per associare i processi a un mount
? E abbastanza sicuro:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Quindi con queste informazioni posso fare, ad esempio da terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Come puoi vedere, con un test un po 'esplicito un simile processo potrebbe essere realizzato per produrre in modo abbastanza affidabile il processo principale di un pty arbitrario. Per quanto riguarda i socket, sono abbastanza sicuro che si possa avvicinarlo da quella direzione oltre a utilizzare socat
un debugger, ma devo ancora chiarire come. Tuttavia, sospetto che ss
potrebbe esserti d'aiuto se ne hai più familiarità di me:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Quindi l'ho impostato con un test un po 'più esplicito, in realtà:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
Esso stampa $$
num \0
nulla byte per ciascun PTY e controlli io di ogni processo padrone contro un precedente controllo. Se la differenza è $$
allora associa il pid al pty. Questo funziona principalmente . Voglio dire, per me, ritorna:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
È corretto, ma, ovviamente, è un po 'audace. Voglio dire, se uno di quegli altri stesse leggendo un mucchio di dati in quel momento probabilmente non ci sarebbe. Sto cercando di capire come cambiare le stty
modalità su un altro pty per inviare prima il bit di stop o qualcosa del genere in modo da poterlo risolvere.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, fornirebbe l'elenco di PID (/proc/PID
) come output.