Code:
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/wait.h>


int const pipeCount = 1;
int pipes[pipeCount][2];




#undef si_pid


void handler_readPipeSIGIO(int sig, siginfo_t *info, void *secret) 
{


    printf( "info->_sifields._sigchld.si_pid: %x\n",  info->_sifields._sigchld.si_pid);


    char buf[ 333 ];
    int ret = read(pipes[0][0], buf, sizeof( buf ));
    if ( ret < 0 ) 
    {
        printf( "Read fail! %d\n", sig);
        fflush(stdout);
    }
    else
    {
        buf[ ret ] = 0;
        printf( "Read data form Process: %s", buf );
        fflush(stdout);
    }


}


int main () 
{
    // Create Pipes
    for(int i = 0; i<pipeCount; i++)
    {
        pipe(pipes[i]);
    }


    // Create Children
    for(int j = 0; j<pipeCount; j++)
    {
        if(fork()==0)
        {
        //CloseAllPipiesButTheOne
            for(int i=0; i<pipeCount; i++)
            {
                close(pipes[i][0]);
                //printf("Process %d Pipe %d End 0 is CLOSE\n", j, i);
                if(j==i)
                {
                    ///printf("Process %d Pipe %d End 1 is OPEN\n", j, i);
                    //printf("MyChildD %d \n", getpid());
                }
                else
                {
                    //printf("Process %d Pipe %d End 1 is CLOSE\n", j, i);
                    close(pipes[i][1]);
                }
            }
            //fflush(stdout);
            //Write data to 0 End of pipes ... 
            while ( 1 )
            {   
                //printf("Writing to Pipe from Child - %d \n", getpid());
                fflush(stdout);
                char buf[ 333 ];
                //sprintf( buf, "Pid: (%d) Random Number: %d\n", getpid(), rand() % 10000 );
                sprintf( buf, "Pid: (%d)\n", getpid());
                write( pipes[j][1], buf, strlen( buf ) );
                sleep( 2 + rand() % 5 );
            }
            return 0;
        }
    }


    //close Pipes
    for(int i=0; i<pipeCount; i++)
    {
        close(pipes[i][1]);
    }


    //SigAction Define


    struct sigaction sa;
    sa.sa_sigaction = handler_readPipeSIGIO; 
    sa.sa_flags = SA_RESTART | SA_SIGINFO; 
    sigemptyset( &sa.sa_mask ); 


    sigaction(SIGIO, &sa, NULL);


    //config read reaction for SIGIO


    for(int i=0; i<pipeCount; i++)
    {
        fcntl( pipes[i][0], F_SETFL, fcntl( pipes[i][0], F_GETFL ) | O_ASYNC );
        fcntl( pipes[i][0], F_SETSIG, SIGIO );
        fcntl( pipes[i][0], F_SETOWN, getpid() );
    }




    printf("Some out ... \n");
    fflush(stdout);
    while(1) sleep (1);
    //wait(NULL);
    return(0);
}
and my output is
Code:
info->_sifields._sigchld.si_pid: 41Read data form Process: Pid: (6327)
info->_sifields._sigchld.si_pid: 41
Read data form Process: Pid: (6327)
info->_sifields._sigchld.si_pid: 41
Read data form Process: Pid: (6327)
where is my mistake?