Chapter Contents

Previous

Next
fork

fork



Create a New Process

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.

Note:    For a more complete description of the realationships between the parent process and the child process, see the POSIX 1003.1 standard.  [cautionend]


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

The OS/390 attributes of the parent process are generally not inherited by the child. In particular, OS/390 files open in the parent cannot be accessed in the child. If the parent process were running under TSO, the child process is not able to read or write the TSO terminal. Also, the child process will have no allocated DD statements, except possibly for a STEPLIB.


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);
}


Output

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.