I have this code with close(2) implemented, as many of you know(including myself) this closes the standard error, but what are the main repercussions of closing it?
And why is "main: Success" printed? Shouldn't every directory have the "." dir that can be opened?
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main() {
close(2);
if (fopen(".","r"))
{
printf("main: %s \n", strerror(errno));
}
return 0;
}
On the other hand
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main() {
close(2);
if (fopen(".","r"))
{
perror("main");
}
return 0;
}
This doesn't print anything, any ideas why?
Standard error is where error messages are supposed to be printed. So
perror()
prints its error message on standard error. If you close standard error, it can't print the message.Yes, it does. You didn't get an error when calling
fopen()
, soerrno == 0
, and the message for this isSuccess
.If you want to print an error message when
fopen()
fails, you need to test forNULL
:Note that when opening files, the FD that's used is the lowest available FD. Since you've closed FD 2, that will most likely be used when opening
.
. So standard error now points to the.
directory, which you can't write to, andperror()
will get an error when it tries to write there. But it can't report this error (where would it report it?).