Fork: Difference between revisions
Content added Content deleted
m (→{{header|C}}: Fixed link to point to compiler, not compiler collection) |
m (Removed from GNU Compiler Collection category) |
||
Line 7: | Line 7: | ||
'''Library:''' [[POSIX]] |
'''Library:''' [[POSIX]] |
||
[[Category:GNU Compiler Collection]] |
|||
<pre> |
<pre> |
||
#include<stdio.h> |
#include<stdio.h> |
Revision as of 02:05, 26 November 2007
![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.
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