--- /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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies) All rights reserved. -->
+<!-- This component and the accompanying materials are made available under the terms of the License
+"Eclipse Public License v1.0" which accompanies this distribution,
+and is available at the URL "http://www.eclipse.org/legal/epl-v10.html". -->
+<!-- Initial Contributors:
+ Nokia Corporation - initial contribution.
+Contributors:
+-->
+<!DOCTYPE concept
+ PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
+<concept id="GUID-383C128C-15EB-4C64-9A1F-F1EA826323D0" xml:lang="en"><title>Parent
+and Child IPC Using Named Pipes or FIFOs</title><prolog><metadata><keywords/></metadata></prolog><conbody>
+<p>An alternative approach to using the <xref href="GUID-A9DB6E7C-B8D6-377A-BBE6-39E0A7A09E5D.dita"><apiname>popen()</apiname></xref> function
+is to use named pipes, or FIFOs. The advantage of using them over the <xref href="GUID-A9DB6E7C-B8D6-377A-BBE6-39E0A7A09E5D.dita"><apiname>popen()</apiname></xref> 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<codeph> stdin()</codeph>/<codeph>stdout()</codeph> streams of the child
+process). </p>
+<p>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 <xref href="GUID-A9DB6E7C-B8D6-377A-BBE6-39E0A7A09E5D.dita"><apiname>popen()</apiname></xref> function, for example, inter-child process
+communication. For more information about the use of FIFOs, see <xref href="http://www.opengroup.org" scope="external">http:\\www.opengroup.org</xref>. </p>
+<p><b>Parent process P.I.P.S. example using FIFOs</b></p>
+<p>The following code shows how FIFOs can be used in P.I.P.S. by the parent
+process.</p>
+<codeblock xml:space="preserve">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;
+}
+</codeblock>
+<p><b>Child process P.I.P.S. example using FIFOs</b></p>
+<p>The following code shows how FIFOs can be used in P.I.P.S. by the child
+process. </p>
+<codeblock xml:space="preserve">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;
+}
+</codeblock>
+</conbody></concept>
\ No newline at end of file