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?