Fork Process

From Rosetta Code

Jump to: navigation, search

Programming Task
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know.

Code examples should be formatted along the lines of one of the existing prototypes.
In this task, the goal is to spawn a new process which can run simultaneously with, and independently of, the original parent process.

Contents

[edit] C

Works with: gcc

Library: POSIX

#include<stdio.h>
#include<unistd.h>

int main(void)
{
  pid_t pid;

  if((pid=fork())==0) {
    printf("This is new process\n");
  } else if(pid>0) {
    printf("This is the original process\n");
  } else {
    printf("ERROR: Something went wrong\n");
  }

  return 0;
}

[edit] Erlang

-module(fork).
-export([start/0]).

start() ->
    spawn(fork,child,[]),
    io:format("This is the original process~n").

child() ->
    io:format("This is the new process~n").

Then you can compile your code and execute it:

c(fork).
fork:start().

[edit] OCaml

#load "unix.cma";;
let pid = Unix.fork ();;
if pid > 0 then
  print_endline "This is the original process"
else
  print_endline "This is the new process";;

[edit] Perl

Works with: Perl version 5.x

In the child code, you may have to re-open database handles and such.

FORK:
if ($pid = fork()) {
    # parent code
} elsif (defined($pid)) {
    setsid; # tells apache to let go of this process and let it run solo
    # disconnect ourselves from input, output, and errors
    close(STDOUT);
    close(STDIN);
    close(STDERR);    
    # re-open to /dev/null to prevent irrelevant warn messages.
    open(STDOUT, '>/dev/null');
    open(STDIN, '>/dev/null');
    open(STDERR, '>>/home/virtual/logs/err.log');
    
    # child code
    
    exit; # important to exit
} elsif($! =~ /emporar/){
    warn '[' . localtime() . "] Failed to Fork - Will try again in 10 seconds.\n";
    sleep(10);
    goto FORK;
} else {
    warn '[' . localtime() . "] Unable to fork - $!";
    exit(0);
}

Obviously you could do a Fork in a lot less lines, but this code covers all the bases

[edit] Pop11

lvars ress;
if sys_fork(false) ->> ress then
   ;;; parent
   printf(ress, 'Child pid = %p\n');
else
   printf('In child\n');
endif;

[edit] Python

Works with: Python version 2.5

import os

pid = os.fork()
if pid > 0:
 # parent code
else:
 # child code

[edit] Toka

needs shell
getpid is-data PID
[ fork getpid PID = [ ." Child PID: " . cr ] [ ." In child\n" ] ifTrueFalse ] invoke

[edit] UnixPipes

Demonstrating a subshell getting forked, and running concurrently with the original process

(echo "Process 1" >&2 ;sleep 5; echo "1 done" ) | (echo "Process 2";cat;echo "2 done")
Personal tools