Apparent bug in fclose()-exec()-freopen() sequence
Keith D Gregory
keith at fstohp.crd.ge.com
Sat Jun 17 04:03:57 AEST 1989
In short, if one attempts to fclose() files, exec() another program,
and freopen() the same files, the freopen() appears to fail. In the
specific case, we ran the following programs on an HP-9000 (HP-UX 6.2)
and a Mac-2 (A/UX 1.1 beta). The second program failed on the second
call to fprintf() (the first completed), leaving beind a core dump.
The _iob for StdErr appeared to be in pretty bad shape (as I recall,
the character pointers were trashed).
As a guess, the startup code in P2 is initalizing its _iob array,
and the call to fclose() (as part of freopen()) is thinking that
the structure refers to a valid stream.
Is this what is happening? Is there any reason (documented) that
we should not close a file before exec()ing a program? The obvious
workaround (leave them open) is in place, but this application is
to run in the background (after a foreground launch), and I don't
particularly want any ill-behave programs to start sending data to
an unclosed StdFile.
Please mail any responses; you will need to explicitly use CRDGW1
as a gateway.
Thanks
Keith D Gregory
keith%fstohp at crdgw1.ge.com
# Program 1 Start, Cut here ###################################################
#include <stdio.h>
void main()
{
fclose( stdin );
fclose( stdout );
fclose( stderr );
execl( "p2", "p2", NULL );
}
# Program 2 Start, Cut here ###################################################
#include <stdio.h>
void main()
{
if (freopen( "/dev/tty", "w", stderr) == NULL)
exit( -1 );
else
fprintf( stderr, "Reopened StdErr, Flags = %d, FileNo = %d\n",
stderr->_flag, stderr->_file );
fflush( stderr );
if (freopen( "/etc/passwd", "r", stdin) == NULL)
perror( "Unable to freopen StdIn" );
else
fprintf( stderr, "Reopened StdIn, Flags = %d, FileNo = %d\n",
stdin->_flag, stdin->_file );
fflush( stderr );
if (freopen( "/tmp/ix", "w", stdout) == NULL)
perror( "Unable to freopen StdOut" );
else
fprintf( stderr, "Reopened StdOut, Flags = %d, FileNo = %d\n",
stdout->_flag, stdout->_file );
fflush( stderr );
}
# Program 2 End, Cut here #####################################################
More information about the Comp.unix.wizards
mailing list