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 !! | ===============================================================================