Как программа может изменить каталог без использования chdir()?

#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() ), и позволяет обеспечить целостность ядра записи (убедитесь, что программа может не претендовать на его текущим рабочим каталогом будет каталог, он на самом деле не имеют к нему доступ).