Выполняет ли exec сохранение дескрипторов файлов

На самом деле это двухэтапный вопрос:

  • Что такое дескриптор файла? Я думал, что это самый фундаментальный способ представить открытый файл. Но так как dup2 может сделать два разных дескриптора файла, указывающих на один и тот же файл, то что это представляет собой уникальный файл?

  • Если я делаю dup2 перед exec, вся программа затем уничтожается, у нее все еще есть одна и та же таблица дескрипторов файлов? Повторяются ли перенаправленные файловые дескрипторы?

Ответ 1

Да. Открытые дескрипторы файлов сохраняются во время вызова exec. Из execve справочная страница (все вызовы exec* являются всего лишь оберткой вокруг этого системного вызова):

По умолчанию файловые дескрипторы остаются открытыми через execve(). Закрытые дескрипторы файлов, отмеченные close-on-exec; см. описание FD_CLOEXEC в fcntl(2).

Фактически, многие программы (включая вашу оболочку) полагаются на эту функцию. Если бы это было не так, ваша программа запустилась без открытия стандартных дескрипторов файлов ввода/вывода/ошибок! Когда оболочка запускает программу, она fork s, dup2 открывает дескрипторы открытого файла tty до 0,1,2, а затем execve вашу новую программу.