I am trying to use signal to sync N processes then print out something. Each child process register a handler which print "yo" and "hihi" when catching SIGUSR1. I use kill(0, SIGUSR1) to trigger every process. Since the default action for catching SIGUSR1 is being killed, I set a do-nothing handler for the main process so that it will wait all child died.
The fork and send signal program will repeat for k times, I expect it will show out N*k times "yo" and "hihi". However, it doesn't show enough "yo" and "hihi" as I expect. The number of "yo" is different every execution.
Here is my code, and thanks for your help!
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <time.h>
    #include <signal.h>
    #include <sys/time.h>
    #include <string.h>
    #define N 3 
    int pid_id[N];
    void handler2 (int signum)
    {
        printf("hihi\n");
    }
    void handler (int signum)
    {
        signal(SIGUSR2, handler2); 
        printf("yo\n");
        raise(SIGUSR2);
    }
    void handler_do_nothing (int signum)
    {
        ;
    }
    void child(int process_index)
    {
        struct sigaction sa;
        /* Register */
        memset(&sa, 0, sizeof(sa));
        sa.sa_handler = handler;
        sigaction(SIGUSR1, &sa, NULL);
        printf("I am %d.\n", getpid());
        pid_id[process_index] = getpid();
        sleep(1);
        exit(0);
    }
    int main()
    {
        int i, k, status;
        pid_t pid[N];
        pid_t pid_wait;
        struct sigaction sa_main;
        /* Register */    /* Main process will terminate if catch SIGUSR1 by default setting*/ 
        memset(&sa_main, 0, sizeof(sa_main));
        sa_main.sa_handler = handler_do_nothing;
        sigaction(SIGUSR1, &sa_main, NULL);
        /* Race k times */
        for (k=0;k<3;k++) 
        {
            for (i=0;i<N;i++)
            {
                pid[i] = fork();
                if (pid[i]==0)
                {
                    child(i);
                }
            }
             // sleep();
             kill(0, SIGUSR1);
            for (i=0;i<N;i++)
            {
                do
                {
                    pid_wait = waitpid(pid[i], &status, WNOHANG);
                    printf("I am waiting..\n");
                    sleep(1);
                }while(pid_wait != pid[i]);
            }
        }
        printf("all done\n");
        return 0;
    }
 
    