Fork: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|C}}: Changeed compiler category. GCC's really needs to be broken apart into individual modules. (GCJ, G++, etc.))
m (→‎{{header|C}}: Fixed link to point to compiler, not compiler collection)
Line 4: Line 4:


=={{header|C}}==
=={{header|C}}==
'''Compiler:''' [[GCC]]
'''Compiler:''' [[gcc]]


'''Library:''' [[POSIX]]
'''Library:''' [[POSIX]]

Revision as of 22:56, 25 November 2007

Task
Fork
You are encouraged to solve this task according to the task description, using any language you may know.

In this task, the goal is to spawn a new process which can run simultaneously with, and independently of, the original parent process.

C

Compiler: 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;
}

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().

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