Мне было интересно, как GDB реализует свою команду tty /dev/pts/foobar
и как она может работать для получения стандартного ввода цели.
Кажется (вокруг строки 799, функция new_tty (void)
, что они просто откройте tty, а затем попробуйте вызвать ioctl( fd, TIOCSCTTY, 0 )
, что на самом деле не удается (таким образом, общеизвестное «предупреждение: GDB: не удалось установить управляющий терминал:»).
В соответствии с man-страницами:
If this terminal is already the controlling terminal
of a different session group, then the ioctl fails
with EPERM, unless the caller has the CAP_SYS_ADMIN
capability and arg equals 1, in which case the termi‐
nal is stolen, and all processes that had it as con‐
trolling terminal lose it.
В результате несколько ресурсов начинают гоняться за ресурсом (процесс, который изначально контролирует терминал, например, /bin/sh
и gdb, здесь), что затрудняет настоящую работу с I / Os. Не удивительно.
Итак, есть ли способ обойти эту битву за ресурсы? Кроме кода помощника Яна Кратохвила (я еще не пробовал, но могу не вижу причин, по которым это не сработает)?