Fork Process
From Rosetta Code
Programming Task
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know.
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")
Categories: Programming Tasks | Programming environment operations | C | POSIX | Erlang | OCaml | Perl | Pop11 | Python | Toka | UnixPipes

