Fork: Difference between revisions
Content added Content deleted
No edit summary |
m (Switch to header template) |
||
Line 3: | Line 3: | ||
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. |
||
== |
=={{header|C}}== |
||
[[Category:C]] |
|||
'''Compiler:''' [[GCC]] |
'''Compiler:''' [[GCC]] |
||
Line 30: | Line 29: | ||
</pre> |
</pre> |
||
== |
=={{header|Erlang}}== |
||
[[Category:Erlang]] |
|||
-module(fork). |
-module(fork). |
||
-export([start/0]). |
-export([start/0]). |
||
Line 48: | Line 45: | ||
fork:start(). |
fork:start(). |
||
== |
=={{header|Perl}}== |
||
[[Category:Perl]] |
|||
'''Interpreter:''' [[Perl]] 5.x |
'''Interpreter:''' [[Perl]] 5.x |
||
Line 93: | Line 89: | ||
endif; |
endif; |
||
== |
=={{header|Python}}== |
||
[[Category:Python]] |
|||
'''Interpreter:''' [[Python]] 2.5 |
'''Interpreter:''' [[Python]] 2.5 |
||
import os |
import os |
||
Line 104: | Line 99: | ||
# child code |
# child code |
||
== |
=={{header|Toka}}== |
||
[[Category:Toka]] |
|||
needs shell |
needs shell |
||
getpid is-data PID |
getpid is-data PID |
Revision as of 05:36, 13 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