Я не могу понять, что не так в следующем коде. Я выполняю те же действия дважды. Он работает впервые и не работает во второй раз.redirect stdin из файлового дескриптора в linux c
- открыт FD
- дубликата на стандартный ввод.
- близко STDIN
- закрыть оригинальную 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
Вызов ['dup2'] (http://man7.org/linux/man-pages/man2/dup2.2.html) закрывает текущий дескриптор файла назначения, поэтому, когда вы закрываете' STDIN_FILENO', вы закрываете дублировать вы только что сделали. –
Открывается ли 'fd' в первом экземпляре ?. Проверьте значение – Sathiya
Возможно, это связано с вашей проблемой, вы * действительно * должны прочитать [страницу '' '' '' '' '' '' '' '' '' '' '' '' '' '' потому что вы не используете его правильно. На самом деле компилятор должен жаловаться на эти вызовы, а если нет, то добавить флаг '-Wall', чтобы включить больше предупреждений. –