![]() Chapter Contents  | 
![]() Previous  | 
![]() Next  | 
| fork | 
| Portability: | POSIX.1 conforming, UNIX compatible | 
| SYNOPSIS | |
| DESCRIPTION | |
| RETURN VALUE | |
| CAUTION | |
| EXAMPLE | |
| Output | |
| RELATED FUNCTIONS | |
| SYNOPSIS | 
#include <sys/types.h> #include <unistd.h> pid_t fork(void);
| DESCRIPTION | 
fork
 creates a child process that duplicates the process that calls 
fork
. The child process is mostly
identical to the calling process; however, it has a unique process ID. Any
open file descriptors are shared with the parent process. The child process
executes independently of the parent process.
| RETURN VALUE | 
fork
 returns 
0
 to
the child process and the process ID of the child process to the parent process. 
fork
 returns 
-1
 to the parent if it is not successful and
does not create a child process.
| CAUTION | 
| EXAMPLE | 
The following example shows a program
that uses 
fork
 to create
a second process that communicates with the parent process with a pipe.  Both
processes send messages to the terminal.  The 
kill
 function is used by the child process to terminate both the child
and the parent.  
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
main()
{
   int pipefd[2];
   char buf[60];
   int l;
   sigset_t shield;
   pid_t mypid;
   pipe(pipefd);
   if (fork()) {
      sigemptyset(&shield);
      sigaddset(&shield, SIGTERM);
      sigprocmask(SIG_BLOCK, &shield, 0);
      mypid = getpid();
      for(;;) {
         printf("%x: What should I give my true love?\\n", mypid);
         l = read(0, buf, 59);
         buf[l-1] = 0;
         write(pipefd[1], buf, l);
         printf("%x: I gave my true love a%s %s.\\n", mypid,
                 strchr("aeiou", buf[0])? "n": "", buf);
         if (strstr(buf, "poison") == buf) {
            printf("%x: Oh! The shame!\\n", mypid);
            sleep(1);
            break;
         }
         sleep(1);
      }
      sigprocmask(SIG_UNBLOCK, &shield, 0);
      sleep(10);
      kill(mypid, SIGABRT);
   }
   else {
      mypid = getpid();
      for(;;) {
         char ch;
         int i = 0;
         do {
            l = read(pipefd[0], &ch, 1);
            buf[i++] = ch;
         } while(l == 1 && ch);
         printf("%x: My true love gave me a%s %s!\\n",
                 mypid, strchr("aeiou", buf[0])? "n": "",
                 buf);
         if (strstr(buf, "poison") != buf) {
            printf("%x: How sweet!\\n", mypid);
         } else {
            printf("%x: Oh, yuck!\\n", mypid);
            kill(getppid(), SIGTERM);
            printf("%x: Die, oh unfaithful one!\\n", mypid);
            kill(mypid, SIGABRT);
         }
      }
   }
   return(255);
}
Here is a possible terminal transcript from this example program:
131073: What should I give my true love? cherry 131073: I gave my true love a cherry. 131073: What should I give my true love! 262148: My true love gave me a cherry! 262148: How sweet! poison pomegranate 131073: I gave my true love a poison pomegranate. 131073: Oh! The shame! 262148: My true love gave me a poison pomegranate! 262148: Oh, yuck! 262148: Die, oh unfaithful one! 131073 [15] Terminated
| RELATED FUNCTIONS | 
atfork
, 
ATTACH
, 
exec
, 
popen
, 
system
![]() Chapter Contents  | 
![]() Previous  | 
![]() Next  | 
![]() Top of Page  | 
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.