fork -- Create a New Process

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.

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 MVS attributes of the parent process are generally not inherited by the child. In particular, MVS 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


Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.