2013-05-28 3 views
0

Ниже приведен фрагмент кода, который объясняет системный вызов dup2. То, что я не понимаю, после дублирования обоих файловых дескрипторов, почему нам нужно закрыть старый дескриптор файла. Поскольку дескриптор «out» теперь закрыт, как сообщение, отправленное в stdout_fileno, также записывается в «out». Обратите внимание, что код не был написан мной.закрытие дескриптора файла, а затем его использование

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

int main(){ 

    int out; 
    out=open("out",O_WRONLY | O_TRUNC | O_CREAT,S_IRUSR|S_IRGRP | S_IWGRP | S_IWUSR); 

    dup2(out,STDOUT_FILENO); 
    close(out); 
    printf("now this should be written to a file called out \n"); 
    return 0; 


} 

ответ

4

почему нам нужно закрыть старый файловый дескриптор

Вы действительно не нужно; пример в основном показывает, что вы можете. Тем не менее, каждый процесс в системе Unix имеет ограниченное количество файловых дескрипторов, и когда у вас есть два из них, ссылающихся на один и тот же файл, один из них не нужен, поэтому вы можете его закрыть.

Поскольку дескриптор «out» теперь закрыт, как сообщение, отправленное в stdout_fileno, также записывается в «out».

Потому что после того, как dup2, STDOUT_FILENO относится к этому файлу, а также и закрытие FD не закрывает его клонов.

+0

спасибо. это объясняет это – DesirePRG

0

stdout, stdin, stderr, все файлы в системах * nix. Вы можете думать о том, что ваш код принимает «указатель» на файл и устанавливает stdout, чтобы указать на этот файл. В этот момент можно удалить первый «указатель». Именно поэтому он использует prnft(); а не fprintf();

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

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

0

Если у вас есть два дескриптора, указывающих на один и тот же файл, запись в обоих случаях приведет к случайному перемещению вывода; но нет ошибки, которую вы можете обнаружить (то есть, запись будет успешной), чтобы сказать, что что-то не так.

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

Смежные вопросы