Если вам интересны функции POSIX, особенно те, которые, кажется, дублируют друг друга, обычно хорошо проверить сам стандарт . Внизу вы обычно увидите примеры, а также рассуждения о реализации (и существовании) обоих.
В этом случае:
Следующие разделы являются информативными.
Примеры
Перенаправление стандартного вывода в файл
Следующий пример закрывает стандартный вывод для текущих процессов, переназначает стандартный вывод для перехода к файлу, на который ссылается pfd
, и закрывает исходный дескриптор файла для очистки.
#include <unistd.h>
...
int pfd;
...
close(1);
dup(pfd);
close(pfd);
...
Перенаправление сообщений об ошибках
В следующем примере перенаправляются сообщения с stderr
на stdout
.
#include <unistd.h>
...
dup2(2, 1); // 2-stderr; 1-stdout
...
Использование приложения
Отсутствует.
Обоснование
Функции dup()
и dup2()
являются избыточными. Их услуги также предоставляются функцией fcntl()
. Они были включены в этот том IEEE Std 1003.1-2001 в основном по историческим причинам, так как многие существующие приложения используют их.
Хотя показанный сегмент краткого кода очень похож по поведению на dup2()
, соответствующая реализация, основанная на других функциях, определенных в этом томе IEEE Std 1003.1-2001, значительно сложнее. Наименее очевидным является возможный эффект функции перехвата сигнала, которая может вызываться между шагами и выделять или освобождать файловые дескрипторы. Этого можно избежать, блокируя сигналы.
Функция dup2()
не помечена как устаревшая, поскольку она представляет безопасную от типов версию функциональности, предоставленную в небезопасной версии с помощью fcntl()
. Используется в привязке POSIX Ada.
Функция dup2()
не предназначена для использования в критических областях в качестве механизма синхронизации.
В описании [EBADF] случай, когда файлы находятся вне диапазона, охватывается данным случаем, когда файлы не являются действительными. Описания для fildes
и fildes2
различны, потому что единственный тип недействительности, который имеет отношение к fildes2
, - находится ли он вне диапазона; то есть не имеет значения, относится ли fildes2
к открытому файлу при выполнении вызова dup2()
.
Будущие направления
Отсутствует.
Смотри также
close()
, fcntl()
, open()
, том Базовых определений IEEE Std 1003.1-2001, <unistd.h>
История изменений
Впервые выпущено в выпуске 1. Получено из выпуска 1 SVID.