diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/PDK/Source/GUID-383C128C-15EB-4C64-9A1F-F1EA826323D0.dita --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/PDK/Source/GUID-383C128C-15EB-4C64-9A1F-F1EA826323D0.dita Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,122 @@ + + + + + +Parent +and Child IPC Using Named Pipes or FIFOs +

An alternative approach to using the popen() function +is to use named pipes, or FIFOs. The advantage of using them over the popen() mechanism +is that they allow the code in both the parent and child processes to continue +to use file descriptors for communication rather than streams (and avoid modification +to the stdin()/stdout() streams of the child +process).

+

In addition, since each created FIFO is referenced as a file in the file +system, FIFOs allow for more complicated IPC schemes than those offered by +the popen() function, for example, inter-child process +communication. For more information about the use of FIFOs, see http:\\www.opengroup.org.

+

Parent process P.I.P.S. example using FIFOs

+

The following code shows how FIFOs can be used in P.I.P.S. by the parent +process.

+int main(int argc, char *argv[]) +{ + char fifoFileName[] = "/root/PortDoc/Example2_c/Symbian/fifofile"; + + int fifoResult = mkfifo(fifoFileName,S_IXGRP); + + if(fifoResult == -1) + { + //FIFO creation failure. + printf("\n*** failure mkfifo ***\n"); + + return EXIT_FAILURE; + } + else + { + //FIFO creation successful. + + //Spawn the child process. + pid_t Childpid; + char execFileName[] = "/root/PortDoc/Example2_c/Symbian/ChildProg"; + int RetVal= posix_spawn(&Childpid,execFileName,NULL,NULL,NULL,NULL); + + if(RetVal != 0) + { + printf("\n*** failure posix_spawn ***\n"); + + return EXIT_FAILURE; + } + else + { + //Open the FIFO. Parent reads from the FIFO + int ReadFifoFd = open(fifoFileName,O_RDONLY); + + if(ReadFifoFd == -1) + { + //Failed to open the Fifo + printf("\n*** failure Fifo Open ***\n"); + + return EXIT_FAILURE; + } + else + { + //create a receive buffer and clear + char RxBuffer[100]; + memset(RxBuffer,0,sizeof(RxBuffer)); + + //Wait for data from the child process. Child sends a string. + int nbytes = read(ReadFifoFd,RxBuffer,sizeof(RxBuffer)); + + printf("\nMessage Received by Parent=%s",RxBuffer); + + //close the FIFO + (void)close(ReadFifoFd); + } + + //wait for the child process to finish + (void)waitpid(Childpid,NULL,0); + + //unlink the FIFO + unlink(fifoFileName); + } + } + return EXIT_SUCCESS; +} + +

Child process P.I.P.S. example using FIFOs

+

The following code shows how FIFOs can be used in P.I.P.S. by the child +process.

+int main(int argc, char *argv[]) +{ + char fifoFileName[] = "/root/PortDoc/Example2_c/Symbian/fifofile"; + + //Open the FIFO. child writes to parent + int WriteFifoFd = open(fifoFileName,O_WRONLY); + + if(WriteFifoFd == -1) + { + //Failed to open the Fifo + printf("\n*** child failure Fifo Open ***\n"); + return EXIT_FAILURE; + } + else + { + //create a message to send. + char TxMsg[] = "Hello Parent\n"; + + //Wait for data from the child process. Child sends a string. + write(WriteFifoFd,TxMsg,sizeof(TxMsg)); + + //close the FIFO + (void)close(WriteFifoFd); + } + return EXIT_SUCCESS; +} + +
\ No newline at end of file