Как опция xterm -S (передает псевдотерминал и дескриптор) работает в Linux?

StackOverflow https://stackoverflow.com/questions/1166493

  •  19-09-2019
  •  | 
  •  

Вопрос

Приветствую, при переносе старого кода Solaris 2.4 на CentOS 5.3 я наткнулся на вызов, подобный

/usr/bin/xterm -S%s%d ...

где %s - двухсимвольная последовательность цифр XX, например 00, 01, а %d - числовой дескриптор файла.По-видимому, это был способ сообщить xterm использовать /dev /ttypXX (псевдотерминал slave), но код, похоже, не утруждает себя открытием соответствующего master, вызывая вместо этого pipe(2) и передавая написать fd в качестве подстановки %d выше.В Solaris запись в этот write fd из средства создания приводит к появлению выходных данных в дочернем xterm.Кстати, в strace(1) я не видел никаких попыток открыть что-либо в /dev .

Это было полезно?

Решение

В соответствии с справочная страница solaris, системный вызов канала создает два двунаправленный трубы.Итак, в solaris вы можете использовать оба fds для чтения и записи:

Файлы, связанные с fildes[0] и fildes1 являются потоками и являются обоими открыты для чтения и записи.

Однако, согласно странице руководства pipe (2) в Linux:

pipe() создает канал, однонаправленный канал передачи данных, который может использоваться для межпроцессного взаимодействия.

Обратите также внимание на следующее из трубы (7):

В некоторых системах (но не в Linux) каналы являются двунаправленными:данные могут быть переданы в обоих направлениях между концами трубопровода.Согласно POSIX.1-2001, каналы должны быть только однонаправленными.Переносимые приложения следует избегать зависимости от двунаправленной семантики канала.


Итак, в Linux вы не можете передать pipefd1, конец записи, в xterm, поскольку он ожидает fd для двунаправленной связи.Чтобы это заработало, вам нужно было бы использовать openpty() и передать подчиненный fd в xterm.

AFAIK, openpty недоступен в Solaris;похоже, именно по этой причине ваш код его не использует.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top