#linux #system-calls
Вопрос:
Я могу найти много документации по использованию chdir()
для изменения каталога в программе (например, командной оболочки). Мне было интересно, можно ли как-то сделать то же самое без использования chdir()
. Тем не менее, я не могу найти никакой документации или примеров кода, в которых человек меняет каталоги, не используя chdir()
их в какой-либо степени. Возможно ли это?
Комментарии:
1. Короткий ответ: Нет.
2. Какова основная проблема, которую вы пытаетесь решить, из-за которой вы хотите/должны изменить каталог без
chdir
?3.
chdir()
это системный вызов, нет ничего более примитивного, чем это.4. Крошка, есть
fchdir()
, и ты можешь позвонить в syscall сам.5. @kaylum Мой профессор обсуждал задание по созданию программы-оболочки, подобной linux, в которой он хотел, чтобы определенная команда изменила каталог, в котором мы находимся. Проблема в том, что он дал спецификацию, согласно которой мы не можем использовать chdir(). Я даже не знал, что это возможно. Похоже, я, возможно, как-то неправильно понял его инструкции, так как не похоже, что это на самом деле выполнимо.
Ответ №1:
В Linux chdir()
это syscall. Это означает, что это не то, что программа делает в своей собственной памяти, но это запрос ядра операционной системы, чтобы сделать что-то от имени программы.
Конечно, это один из двух системных вызовов, которые могут изменять каталоги, — другой fchdir()
. Теоретически вы могли бы использовать другой вариант, хотя вопрос о том, действительно ли этого хочет ваш профессор, очень открыт для интерпретации.
С точки зрения того, почему chdir()
и fchdir()
не может быть повторно реализовано приложением, но необходимо использовать: текущий рабочий каталог относится к состоянию процесса, поддерживаемому ядром от имени программы; сама программа не может получить доступ к памяти ядра, не попросив ядро работать от ее имени.
Вещи являются системными, потому что они должны быть системными-если бы что-то можно было сделать в процессе, это было бы сделано таким образом (пересечение границы между пользовательским пространством и пространством ядра влечет за собой штраф за переключение контекста; это не без влияния на производительность). В этом случае, позволяя ядра точного учета как процесса рабочий каталог является гарантией того, что в рабочем каталоге, сохраняется при новый исполняемый файл загружается (с execve()
), и позволяет обеспечить целостность ядра записи (убедитесь, что программа может не претендовать на его текущим рабочим каталогом будет каталог, он на самом деле не имеют к нему доступ).