LINUX.ORG.RU

Дескрипторы стандартных потоков — всегда 0, 1 и 2. Ей не нужно их получать, они фиксированы.

А у ядра уже есть какая-то информация про процесс, в том числе и о том, куда мапятся эти файловые дескрипторы.

Предлагаю тебе почитать о том, как делаются пайпы в сях (man 2 pipe) и заодно map 2 dup2, который осуществляет «подмену» файловых дескрипторов, это должно помочь в осознании сабжа.

devsdc ★★
()

Шелл/whatever открывает нужные файлы, делает форк, дупит дескрипторы на 0,1,2, остальные закрывает (или cloexec), делает exec. Процесс наследует открытые дескрипторы.

arturpub ★★
()

Если кратко, то пайп это два дескриптора, один для записи, другой для чтения. cat | head. Шелл создает пайп, после форка для cat пишущий конец дупит в 1, а после форка для head читающий в 0. Так два процесса оказываются замкнуты через ядерный пайп.

arturpub ★★
()
Ответ на: комментарий от arturpub

с файлами понятно. а как шелл определяет, на каком tty запущен? как получает от ядра дескриптор для пайпа?

Lincor
() автор топика
Ответ на: комментарий от Lincor

Шелл запущен от логина, логин от кого запущен я не знаю, наверное от инита. В общем этот кто-то прочитал /etc/ttys и подсунул прописанные там девайсы прописанным там утилкам. Могу сильно соврать, т.к. лишь краем уха интересовался, жди спецов.

arturpub ★★
()
Ответ на: комментарий от arturpub

я правильно понимаю, что шелл после форка закрывает в том числе стандартные потоки? а dup потом выбирает наименьший свободный индекс. шелл дапает по очереди новые stdin, stdout и stderr, именно в таком порядке.

Lincor
() автор топика
Ответ на: комментарий от Lincor

как получает от ядра дескриптор для пайпа?

int fds[2]; pipe(fds);

arturpub ★★
()
Ответ на: комментарий от Lincor

да, все прояснилось. init запускает несколько getty, передавая им их консоли в качестве аргумента. ну, и еще есть какая-то gettytab, если нет аргумента.

всем спасибо.

Lincor
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.