Проблема с дескриптором файла при системном вызове в C

В моей программе на 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?

Спасибо!

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

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

person Daniel Standage    schedule 03.08.2011    source источник
comment
Мне просто интересно, почему это не так: Выполнение команды: 'cat temp.txt'   -  person Andrejs Cainikovs    schedule 03.08.2011
comment
Что-нибудь сделано с stdout? Возможно, он закрыт до звонка?   -  person    schedule 03.08.2011
comment
возможно, у вас закрыт стандартный вывод?   -  person ysth    schedule 03.08.2011
comment
Как у вас работает программа? Возможно, вы закрыли стандартный вывод (например, если вы разветвились)   -  person Foo Bah    schedule 03.08.2011
comment
Вы закрыли stdout по какой-то причине?   -  person Hasturkun    schedule 03.08.2011
comment
@FooBah: разветвление не закроет стандартный вывод.   -  person Hasturkun    schedule 03.08.2011
comment
Не могли бы вы попробовать sprintf(command, cat %s › /dev/stdout, имя файла);   -  person Andrejs Cainikovs    schedule 03.08.2011
comment
Хорошо, это было так. Я случайно закрыл стандартный вывод до того, как команда была выполнена.   -  person Daniel Standage    schedule 03.08.2011
comment
Первый, кто опубликует ответ, получит согласие!   -  person Daniel Standage    schedule 03.08.2011
comment
Ах.. И я готовил хороший ответ...   -  person Andrejs Cainikovs    schedule 03.08.2011
comment
@Andrejs Извините, оказывается, это была простая ошибка, я просто не распознал предупреждающее сообщение.   -  person Daniel Standage    schedule 03.08.2011
comment
@Hasturkun иногда люди явно закрывают stderr. Одним из примеров обстоятельств, при которых человек может закрыть stderr, является разветвление процесса. Я не имел в виду, что разветвление автоматически закрывает stderr.   -  person Foo Bah    schedule 04.08.2011


Ответы (1)


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

person Andrejs Cainikovs    schedule 03.08.2011