Fork: Difference between revisions

From Rosetta Code
Content added Content deleted
m (Fork Proccess moved to Fork Process: Don't need an extra c in "process")
(C/POSIX example)
Line 2: Line 2:


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

==[[C]]==
[[Category:C]]
'''Compiler:''' [[GCC]]

'''Library:''' [[POSIX]]
[[Category:GCC]]

<pre>
#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;
}
</pre>





Revision as of 21:43, 16 May 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;
}


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