практические примеры используют дубликат или dup2

Лучшее решение, которое я нашел:

this.focus();
self.opener=this;
self.close();
63
задан Matheus Santana 13 March 2018 в 19:22
поделиться

3 ответа

Одним из примеров использования может быть перенаправление ввода-вывода. Для этого вы разветвляете дочерний процесс и закрываете дескрипторы файлов stdin или stdout (0 и 1), а затем выполняете dup () для другого файлового дескриптора по вашему выбору, который теперь будет сопоставлен с самым низким доступным дескриптором файла, который находится в этом case 0 или 1.

Теперь вы можете запустить любой дочерний процесс, который, возможно, не знает о вашем приложении, и всякий раз, когда дочерний процесс записывает на стандартный вывод (или читает из стандартного ввода, независимо от того, что вы настроили), данные записываются в предоставленный дескриптор файла вместо этого.

Оболочки используют это для реализации команд с конвейерами, например / bin / ls | подробнее , соединив стандартный вывод одного процесса со стандартным вводом другого.

62
ответ дан 24 November 2019 в 16:24
поделиться

Одним из практических примеров является перенаправление выходных сообщений в какой-то другой поток, например в некоторый файл журнала. Вот пример кода для перенаправления ввода-вывода.
Пожалуйста, обратитесь к исходному сообщению здесь

#include <stdio.h>

main()
{
    int    fd;
    fpos_t pos;

    printf("stdout, ");

    fflush(stdout);
    fgetpos(stdout, &pos);
    fd = dup(fileno(stdout));
    freopen("stdout.out", "w", stdout);

    f();

    fflush(stdout);
    dup2(fd, fileno(stdout));
    close(fd);
    clearerr(stdout);
    fsetpos(stdout, &pos);        /* for C9X */

    printf("stdout again\n");
}

f()
{
printf("stdout in f()");
}
5
ответ дан 24 November 2019 в 16:24
поделиться

Если вам интересно узнать о функциях POSIX, особенно о тех, которые, кажется, дублируют себя, обычно полезно проверить сам стандарт . Внизу вы обычно видите примеры, а также аргументы в пользу реализации (и существования) обоих.

В данном случае:

Следующие разделы носят информативный характер.

Примеры

Перенаправление стандартного вывода на a File

Следующий пример закрывает стандартный вывод для текущих процессов, переназначает стандартный вывод для перехода к файлу, на который ссылается 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 вне допустимого диапазона распространяется на данный случай недействительности fildes. Описания для fildes и fildes2 различаются, потому что единственный вид недействительности, имеющий отношение к fildes2 , - это то, находится ли она вне допустимого диапазона; то есть не имеет значения, ссылается ли fildes2 на открытый файл, когда делается вызов dup2 () .

Future Directions

Нет.

10
ответ дан 24 November 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: