static int setup_named_pipes (ACE_Process_Options &opt) { // Create a unique temporary name for named pipe. ACE_TCHAR *rendezvous = ACE_OS::tempnam (rendezvous_dir, rendezvous_pfx); // Out of memory? if (rendezvous == 0) return -1; // Alright, this is indeed strange. Named pipes are meant to be // used for unrelated processes. Because of the constraints in // ACE_Process, I have to pre-open the named pipes here. ACE_FIFO_Recv rfifo; // read end fifo. ACE_FIFO_Send wfifo; // write end fifo. // Check if the pipes are created successfully. if (rfifo.open (rendezvous) == -1 || wfifo.open (rendezvous) == -1) { ACE_OS::free (rendezvous); ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "fifo.open"), -1); } // Remove (rm, del) the file after no one uses it any more. ACE_OS::unlink (rendezvous); ACE_OS::free (rendezvous); // Setting up pipe between parent and child process. Use the read // end of the named pipe as child process'es ACE_STDIN. // ACE_Process_Options will keep copies (by dup) of fd's that we // pass in. Notice that we have to specify child process to use // ACE_STDOUT for output explicitly because we'll close it down in // the line after. Child process will use whatever we use to dup2 // ACE_STDOUT as its stdout. opt.set_handles (rfifo.get_handle (), ACE_STDOUT); // The previous keep a copy of original ACE_STDOUT fd, now we // can replace ACE_STDOUT of parent process to the write end // of the named pipe. ACE_OS::dup2 (wfifo.get_handle (), ACE_STDOUT); // Close unused fd's. Notice ACE_FIFO doesn't close the fd // when it goes out of scope. rfifo.close (); wfifo.close (); return 0; }
int main (int, char *[]) { ACE_FIFO_Send client (ACE_DEFAULT_RENDEZVOUS); char buf[BUFSIZ]; while (ACE_OS::fgets (buf, sizeof buf, stdin) != 0) { ssize_t n = ACE_OS::strlen (buf); if (client.send (buf, n) != n) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "send"), 1); } if (client.close () == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "close"), 1); return 0; }