This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 2.2.x mips signal crash


>>>>> "HJ" == H J Lu <hjl@lucon.org> writes:

HJ> On Thu, Oct 31, 2002 at 02:50:28PM -0500, Jes Sorensen wrote:
>> Hi
>> 
>> We are chasing a problem on Linux/mips with glibc-2.2.x, which I am
>> not sure whether is a kernel bug or a libc bug. We haven't been
>> able to reproduce it under Linux/x86 or Linux/ia64 so far though.
>> 
>> Basically what seems to be happening is the following, a task is
>> spawned from fork(), the child sends some signals to the parent
>> after which it exits.

[snip]

HJ> A testcase?

Included - but please no swearing, it's not pretty (no I didn't write
it ;-)

Thanks,
Jes

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>


pid_t child = 0;

void usr1handler(int sig)
{
     printf("pid=%d usr1handler\n", getpid());
}

void usr2handler(int sig)
{
     printf("pid=%d usr2handler\n", getpid());
     kill(child, SIGALRM);
}

pid_t forkit()
{
     pid_t pid = fork();
     if (0 == pid)
     {
         // Child
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
	 usleep(15);
         kill(getppid(), SIGIO);
     sleep(1);
     }
     return pid;
}

void reaper(int sig)
{
     int status = 0;
     pid_t pid = wait(&status);
     printf("reaper: process %d returned %d\n", pid, status);
     child = forkit();
}

int main(int argc, char* argv[])
{
     signal(SIGCHLD, reaper);
     signal(SIGIO, usr2handler);
     signal(SIGALRM, usr1handler);

     child = forkit();
     if (0 != child)
     {
         // Parent
         sleep(20);
         sleep(20);
         sleep(20);
         sleep(20);
     }
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]