Fork
In this task, the goal is to spawn a new process which can run simultaneously with, and independently of, the original parent process.
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
C
Compiler: gcc
#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; }
Erlang
-module(fork). -export([start/0]). start() -> spawn(fun child/0), 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().
Java
public class Threads{ public static void main(String[] args){ Thread otherProgram = new Thread(){ //anonymous class definition //this overridden method counts once every second up to five public void run(){ for(int i= 0; i <= 5; i++){ System.out.println("otherProgram: " + i); try{ Thread.sleep(1000); //pause this thread for a second }catch(InterruptedException e){ System.err.println(e.getMessage()); } } } }; otherProgram.start(); //calling .run() will not run it in a new thread for(int i= 0; i <= 5; i++){ System.out.println("this: " + i); try{ Thread.sleep(1000); //pause this thread for a second }catch(InterruptedException e){ System.err.println(e.getMessage()); } } } }
Output (of one particular run--output may vary):
this: 0 otherProgram: 0 this: 1 otherProgram: 1 this: 2 otherProgram: 2 this: 3 otherProgram: 3 otherProgram: 4 this: 4 otherProgram: 5 this: 5
Perl
Interpreter: Perl 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
Pop11
lvars ress; if sys_fork(false) ->> ress then ;;; parent printf(ress, 'Child pid = %p\n'); else printf('In child\n'); endif;
Python
Interpreter: Python 2.5
import os pid = os.fork() if pid > 0: # parent code else: # child code
Toka
needs shell getpid is-data PID [ fork getpid PID = [ ." Child PID: " . cr ] [ ." In child\n" ] ifTrueFalse ] invoke