LINUX.ORG.RU

Как работает открывание stdin по символьному имени?

 ,


0

1
$ ls -1 /dev/std*
/dev/stderr
/dev/stdin
/dev/stdout

Если я открываю файл, передавая ему эти имена в качестве строки в параметр «имя файла».

В каком месте софта эти строки будут заменяться на стандартны хендлы? Эти константы зашиты в ядро Linux? Или этим занимается udev? Или как это работает? udev при чём или не при чём?

Ответ на: комментарий от Nuna

Я уже догадался, но исходный вопрос звучал так:

какой кусок софта отвечает за сопоставление строк и этих констант?

Полагаю, libc в данном случае

Здесь (и в ОП как таковом) речь не о FILE *std{in,out,err}, а о файловых дескрипторах.

intelfx ★★★★★
()

/dev/stdin это ссылка на /proc/self/fd/0. Её создаёт udev, насколько я знаю. /proc/self/fd создаётся procfs, это реализовано в ядре и указывает туда, откуда берётся stdin для данного процесса, это может быть /dev/pts/0, например, если мы сидим через псевдотерминал, это может быть /dev/null, если мы перенаправили туда, это может быть какой-то файл или вообще не файл, например readlink /proc/self/fd/1 | cat выведет что-то вроде pipe:[54614]. На стандартные хендлы оно нигде заменяться не будет, насколько я понимаю.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

/dev/stderr

В каком месте софта эти строки будут заменяться на стандартные хендлы?

очень сильно в двух словах: после разрешения всех ссылок в файловой системе, будет получен некий файл(инод) который указывает на символьное устройство. При его открытии по major minor будет выбран соответсвующий поток. Он получит свой номер с дескрипторах приклада, библиотека IO вашего чего-то создаст кучку структур и вы будете общаться с этой кучкой, считая её «стандартным хендлом».

схожесть имён «FILE *stderr» «/dev/stderr» - просто соглашение об именованиях, и то что он совпали считайте удобной случайностью и не полагайтесь на это.

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

Не на то отвечаешь. Кто ссылки разыменовывает тебе? Шелл?

Nuna
()
Ответ на: комментарий от intelfx

Допустим, у меня виндоус. У виндоус эмуляция ядра живёт в cygwin.dll и прочих, приложение может быть собрано с mingw без этой эмуляции, тот же баш. Кто тут за это отвечает? Всё исключительно в юзерспейсе. Получается, если несколько вариантов? Lxcore.sys самый модный конечно, но ведь жили и до него.

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

Wine тоже работает исключительно в юзерспейсе. Это не означает, что он не может эмулировать функции ядра NT.

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

приложение может быть собрано с mingw без этой эмуляции, тот же баш

Кто тут за это отвечает?

В зависимости от того, что такое «это», ответ — msvcrt.dll или ядро Windows. Я для кого выше писал "FILE * — это абстракция"? В Windows сишный stdio — это обёртка над нативными файловыми объектами Win32 API, и всё тут. Вместо open(2), read(2), write(2) и close(2) она вызывает CreateFile, ReadFile, WriteFile и CloseHandle.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.