linux bug in pclose

Daniel Roche (dan@apolline.lectra.fr)
Fri, 12 Jul 1996 11:13:47 GMT


Hello Linux Guys !

I have found a strange bugs in linux-2.0.5 !

here is a little program :
==================cut here===================
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

static void SonIsDead();
static int nbpgm;

main(ac,av)
int ac;
char *av[];
{
int pid;
FILE *comm;

nbpgm = 0;
signal( SIGCHLD, SonIsDead );

if ((pid = fork()) == 0) {
system("xlogo");
exit( 0 );
}
if( pid != -1 ) {
printf("launching xlogo pid = %d\n",pid);
nbpgm ++;
} else {
perror("fork");
exit(1);
}

printf("writing to a pipe\n");
comm = popen( "cat", "w" );
if( comm != NULL ){
fprintf(comm,"aaaaaaaaaaaaaaaaaa\n");
fprintf(comm,"bbbbbbbbbbbbbbbbbb\n");
pclose(comm);
}
printf("end writing to a pipe\n");

printf("waiting son to die\n");

while ( nbpgm ) {
sleep(1);
}
printf("OK\n");
}

static void SonIsDead(){
int pid;

/* sous linux on rearme le signal car ya pas de sigset */
signal( SIGCHLD, SonIsDead );

pid = wait( 0 );

printf("Son %d is dead \n",pid);

if( nbpgm > 0 )
nbpgm--;
}
==================cut here===================

this program fork xlogo (for instance!) and wait for the son to die
by catching SIGCHLD.

in addition , it write some data to a pipe , then close the pipe
and finally wait until the son is dead !

This is working perfectly well on linux-1.2.13 or linux-1.3.100

but on linux-2.0.1 and linux-2.0.5 the pclose is blocked until the
son is dead !!
In addition we got 2 signal SIGCHLD , one with the good pid ,
and one with pid == -1 !

Have Fun !

-- 
===============================================================================
|                               _                  |       dan@lectra.fr      |
|  __/ _    _  o  _   /        /_) _   _  /  _     |                          |
| (_/ (_(_ / ) ( (-' /        /\  (_) (_ /) (-'    |  May the source be with  |
|                                                  |            you  !!       |
===============================================================================