Управляющий терминал и новый сеанс - PullRequest
2 голосов
/ 20 декабря 2010

Как процесс (в моем случае руководитель сеанса) может получить управляющий терминал?

Что я делаю в своей программе:

1. fork;
2. parent -> while(1) or smth. similar;
3. child  -> setsid();
             exec "man ps";

Я верил, что ничего не получу в выводе.(child является лидером сеанса и, следовательно, теперь он не имеет никакого отношения к старому tty) Но я понял и не понимаю почему.Мужские выходы.Но не интерактивно.Когда я нажимаю Ctrl-z, он становится интерактивным, когда я нажимаю 'q', он завершается и возвращается к моей проге (родительской).Итак, вопросы:

  1. Пожалуйста, объясните, что происходит в начале (почему я должен нажать ctrl-z, читайте выше)
  2. Почему человек выводит некоторые данные в этой оболочке?
  3. Как человек может сделать это без подключения к tty (я проверил это с помощью ps, у человека и пейджера есть «?» В столбце TTY)
  4. И наконец: как новый руководитель сеанса может получить управляющийТерминал.Есть ли какие-нибудь способы кроме open(/dev/tty)?

1 Ответ

3 голосов
/ 05 января 2011

Q. 1. до 3 .: Дочерний процесс сохраняет доступ к stdin, stdout и т. Д. Даже после setsid (). Вам необходимо закрыть их явно (или открыть, используя, например, *. 1001 *).

Q 4.:

Когда лидер сеанса без управляющего терминала открывает файл терминального устройства и флаг O_NOCTTY при открытии сбрасывается, этот терминал становится управляющим терминалом, назначенным руководителю сеанса, если терминал еще не назначен на какой-то сеанс

http://uw714doc.sco.com/en/SDK_sysprog/_The_Controlling-Terminal_and_Pr.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...