Ошибка дескриптора файла с системным вызовом в C - PullRequest
0 голосов
/ 03 августа 2011

В моей программе на C я выполняю системный вызов, который выполняет команду UNIX 'cat', что-то вроде этого.

sprintf(command, "cat %s", filename);
fprintf(stderr, "Executing command: '%s'\n", command);
system(command);

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

Executing command: 'cat temp.txt'
cat: stdout: Bad file descriptor

У меня вопрос двоякий.

  1. Почему этот код работает неправильно и как я могу это исправить?
  2. Когда я пытаюсь что-то наподобие perl -e 'system("cat temp.txt")' в командной строке, оно работает как положено.В чем разница между тем, как Perl работает с дескрипторами файлов, и тем, как C работает с ними?

Спасибо!

Обновление : благодаря комментариям я понялдовольно быстро.Ранее я случайно закрыл стандартный вывод в программе, поэтому произошла ошибка, когда программа cat пыталась распечатать на стандартный вывод.Таким образом, похоже, что нет разницы между тем, как C и Perl обрабатывают файловые дескрипторы: следующая команда генерирует точно такую ​​же ошибку.

$ perl -e 'close(STDOUT); system("cat temp.txt")'
cat: stdout: Bad file descriptor

1 Ответ

2 голосов
/ 03 августа 2011

Похоже, по умолчанию вашего stdout дескриптора файла нет. stdout закрыто.

...