Стандартная ошибка - это место, где должны печататься сообщения об ошибках. Итак, perror()
печатает сообщение об ошибке при стандартной ошибке. Если вы закроете стандартную ошибку, она не сможет распечатать сообщение.
Почему печатается «main: Success»? Не в каждом каталоге должен быть символ "." dir, который можно открыть?
Да, открывает. Вы не получили сообщение об ошибке при вызове fopen()
, поэтому errno == 0
, и сообщение для этого: Success
.
Если вы хотите распечатать сообщение об ошибке при сбое fopen()
, вам нужно для проверки NULL
:
if (fopen(".") == NULL) {
printf("main: %s \n", strerror(errno));
}
Обратите внимание, что при открытии файлов используемый FD является самым низким доступным FD. Поскольку вы закрыли FD 2, он, скорее всего, будет использован при открытии .
. Таким образом, стандартная ошибка теперь указывает на каталог .
, в который вы не можете писать, а perror()
получит сообщение об ошибке при попытке записи в него. Но он не может сообщить об этой ошибке (где бы он сообщил об этом?).