#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>

#define CHILDREN 500
#define ITERATIONS 20
#define SIGITERATIONS 20
int     *procs;

int     sigary[] = {2, 3, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 0};
void catch_sig();
int     sid;

main()
	{
        int     i, iter, j, pid, k, l, m, size, fd;

        size = CHILDREN * 4;

        fd = open("/dev/zero", O_RDWR);
        procs = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        bzero(procs, size);

        for (i = 0; sigary[i] > 0; i++)
                signal(sigary[i], SIG_IGN);

		sid = getsid();

		sid  += 1000;
		setsid(sid);

	for (iter = 1; iter <= ITERATIONS; iter++)
	{
		for (i = 0; i < CHILDREN; i++)
                                    {
                                            if ((pid = fork()) == 0)
                                            {
                                                    for (k = 0; k < SIGITERATIONS; k++)
                                                            for (m = 0; sigary[m] > 0; m++)
                                                                    sigsend(P_SID, sid, sigary[m]);
                                                    exit(0);
                                            }
                                            else if (pid == -1)
                                            {
                                                    printf("Could fork only %d processes\n",i);
                                                    break;
                                            }
                                            else    
                                                    procs[i] = pid;
                                    }
                                    printf("Iteration %d, started %d children.\n",iter, i);
                                    for (j = 0; j < i; j++)
                                            wait((int *) 0);
                            }
                    }

                    void
                    catch_sig(sig)
                    int     sig;
                    {
                            signal(sig, catch_sig);
}