как сказать, если поток закрыт в C перед вызовом fclose () - PullRequest
3 голосов
/ 03 марта 2010

У меня есть сбойная программа на C, и я сузил ее до fork() ed ребенка, пытающегося закрыть stdout и stderr, которые были закрыты его родительским процессом перед вызовом fork() - я предполагаю, что эти потоки были переданы на дочерний процесс.

как я могу сказать, если поток закрыт в C, прежде чем пытаться закрыть его, используя что-то вроде fclose(stdout)

Ответы [ 4 ]

2 голосов
/ 03 марта 2010
Программы

C в UNIX ожидают, что дескрипторы файлов 0, 1 и 2 будут открыты при запуске. Если вы не хотите, чтобы они куда-то уходили, откройте /dev/null и dup для этих файловых дескрипторов.

0 голосов
/ 03 марта 2010

Вы можете использовать ftell (), чтобы проверить это. Если он возвращает -1, ваш поток в основном закрыт.

0 голосов
/ 03 марта 2010

После вызова fclose () любое использование поток приводит к неопределенному поведению.

Так что, если это стандартный файл FILE *, вы больше не можете использовать stdout, даже чтобы проверить, действительно ли он / открыт.

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

struct stat stbuf;
if(fstat(1,&stbuf) == -1) {
  if(errno == EBADF) {
    stdout isn't open/valid
  }
}
0 голосов
/ 03 марта 2010

Если вы работаете на этом уровне, вам, вероятно, не следует использовать буферизованные FILE указатели (stdin & co) стандартной библиотеки C, а использовать базовый дескриптор файла целые числа сами по себе.

Вы должны быть в состоянии выполнить некоторые безвредные операции, например, возможно, <a href="http://www.manpagez.com/man/2/lseek/" rel="nofollow noreferrer">lseek(fd, 0, SEEK_SET)</a> над файлом, чтобы определить, является ли базовый дескриптор действительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...