Example to demonstrate de bug. #define _GNU_SOURCE #include <stdio.h> #include <assert.h> int main(void) { FILE *fp, *fp1; fp = tmpfile(); fp1 =tmpfile(); assert ( fcloseall() == 0 ); assert ( fputs("doh", fp) < 0 ); assert ( fputs("bla", fp1) < 0 ); return 0; } after the fcloseall() call all writes to the stream must fail..it really does not appear to be doing anything.
There is no way to find out because any use of any FILE pointer after fcloseall is undefined.
(In reply to Andreas Schwab from comment #1) > There is no way to find out because any use of any FILE pointer after > fcloseall is undefined. yes, I guess I wrote the wrong test.. :-) my point is that fcloseall() is not closing streams, at least it is not doing what the manual says.. "This function causes all open streams of the process to be closed and the connections to corresponding files to be broken." the streams are NOT closed..fds are not closed either.
Or perhaps the streams and file descriptors ARE closed, but fputs error checking isn't working properly? Cf. https://sourceware.org/bugzilla/show_bug.cgi?id=20632, where I found the first fputws to a closed stderr (that is, a close(2) was done) does return -1, as it should, but subsequent calls of fputws return 1 as if they are OK. But they aren't, no text appears.
(In reply to Ruud Harmsen from comment #3) > Or perhaps the streams and file descriptors ARE closed, but fputs error > checking isn't working properly? Cf. > https://sourceware.org/bugzilla/show_bug.cgi?id=20632, where I found the > first fputws to a closed stderr (that is, a close(2) was done) does return > -1, as it should, but subsequent calls of fputws return 1 as if they are > OK. But they aren't, no text appears. In my test, file descriptors are not closed by a call to fcloseall() Andreas is entirely right that doing anything with fp and fp1 after fcloseall() is UB. (it woould be incredible nice to get an error/assertion/fortify_fail or whatever in that case but that is again not required by anything) however when I tested nothing was closed in the first place.
expectation : fcloseall() sorts all file descriptors associated with FILE* s in the current thread, calls close_range(2) on them.. ..and maybe..just maybe add a warning attribute to the function discouraging people to use it..