Если fclose (0) вызывается, то это закрывает stdin?

Если вызывается fclose (0), то это закрывает stdin?

Причина, по которой я спрашиваю об этом, заключается в том, что по какой-то причине stdin закрывается в моем приложении, и я не могу понять, почему. Я проверил fclose (stdin), и это не в приложении, и поэтому мне было интересно, может ли fclose (0) вызвать поведение undefined, например, закрыть stdin?

Если нет, то каким образом можно было бы ошибочно закрыть stdin?

Ответ 1

Подпись fclose такова:

int fclose ( FILE * stream );

Это означает, что fclose ожидает указатель на объект FILE. Поэтому, если вы передадите 0, вместо указателя 0 будет пониматься как NULL указатель 1. Если его указатель NULL, как вы ожидаете, его закрыть stdin? Он не будет закрыт. Используйте fclose(stdin), поскольку stdin сам является указателем на объект FILE.

Я думаю, вы путаете stdin с файловым дескриптором, который имеет целочисленный тип и обычно обозначается как fd. Его правда, что входной поток fd равен 0. Поэтому, если вы хотите использовать fd (вместо FILE*), вы должны использовать close из <unistd.h>.

#include <unistd.h>
int close(int fildes);

То есть, close(0) закрывает stdin.

<суб > 1: Кажется интересным, что если вы отправили 1, чтобы закрыть закрытие stdout, ваш код даже не будет компилироваться, и вы сразу увидите проблему с вашим кодом во время компиляции. Теперь вопрос в том, почему он не компилируется? Поскольку в отличие от 0, 1 неявно преобразован в тип указателя. Компилятор будет генерировать сообщение типа "error: invalid conversion from ‘int’ to ‘FILE*’. См. Номер ошибки и номер строки здесь на ideone.

Ответ 2

Я думаю, что это займет fclose(NULL); Который должен быть undefined и может упасть.

Ответ 3

Следующее закрывает stdin: close(0); fclose(stdin); close(STDIN_FILENO); daemon(0, 0);

Ответ 4

fclose(0) вызывает undefined поведение, так что да, он может сделать что угодно, включая закрытие stdin. Но у вас гораздо больше проблем, если в коде появляется fclose(0).