2015-03-31 7 views
0

Я не могу понять, что не так в следующем коде. Я выполняю те же действия дважды. Он работает впервые и не работает во второй раз.redirect stdin из файлового дескриптора в linux c

  1. открыт FD
  2. дубликата на стандартный ввод.
  3. близко STDIN
  4. закрыть оригинальную Fd

Во второй раз, когда я получаю сообщение об ошибке, на этапе 4, что означает, что FD уже закрыт.

int fd =open("/path/to/some/file",0,"r"); 
    if (dup2(fd,STDIN_FILENO)<0) 
    perror("dup_in"); 
    if (close(STDIN_FILENO)<0) 
    perror("close_in"); 
    if (close(fd)<0) 
    perror("close_fd"); 

    //Up to here it works fine. 

    fd =open("/path/to/some/file",0,"r"); 
    if (dup2(fd,STDIN_FILENO)<0) 
    perror("dup_in2"); 
    if (close(STDIN_FILENO)<0) 
    perror("close_in2"); 
    if (close(fd)<0) //<-- ERROR! 
    perror("close_fd2"); //<--close_fd2: Bad file descriptor 
+1

Вызов ['dup2'] (http://man7.org/linux/man-pages/man2/dup2.2.html) закрывает текущий дескриптор файла назначения, поэтому, когда вы закрываете' STDIN_FILENO', вы закрываете дублировать вы только что сделали. –

+0

Открывается ли 'fd' в первом экземпляре ?. Проверьте значение – Sathiya

+2

Возможно, это связано с вашей проблемой, вы * действительно * должны прочитать [страницу '' '' '' '' '' '' '' '' '' '' '' '' '' '' потому что вы не используете его правильно. На самом деле компилятор должен жаловаться на эти вызовы, а если нет, то добавить флаг '-Wall', чтобы включить больше предупреждений. –

ответ

3

Согласно man page

int dup2(int oldfd, int newfd);

Если oldfd является действительный дескриптор файла, и newfd имеет такое же значение, как oldfd, то dup2() ничего не делает, и возвращает newfd.

Таким образом, в вашем втором случае open() использует наименьший доступный FD, 0 [free'd последним вызовом close()]. Вот как oldFD и newFD становятся теми же, создавая ошибку.

Примечание: Перед использованием fd, возвращенного open(), вы всегда должны проверить успешность звонка open().

+0

Спасибо! Моя первоначальная проблема заключалась в том, что FD был создан при вызове socket accept. Для чего я не вижу на странице man, которая использует самый низкий доступный FD (но после проверки это та же проблема). – Tzafrir

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

  • Нет связанных вопросов^_^