fork
fork — duplicates a process.
fork ()
none
A positive task id that identifies the child process, and 0 that identifies the parent process to the child; or -1 if an error occurred. The errno is set if an error occurs.
The fork function creates a new process identical to
the calling (parent) process except for a unique process ID. The child
process has a different parent process ID and its own copy of the parent
file descriptors. The child process does not inherit outstanding signals.
The following example illustrates using the fork
function with if syntax. This is a useful way of
separating the two, identical processes produced from
fork. The first block of code applies to the parent
process, while the second block applies to the child.
#!/usr/cogent/bin/gamma
if ((childID = fork()) > 0)
{
princ("P> My ID is: ", getpid(),"\n");
princ("P> My child's ID is: ", childID, "\n");
signal(SIGCHLD, #princ("P> Signal received that my child -- ",
childID, " -- has died.\n"));
princ("P> Waiting for my child.\n");
w = wait(childID);
princ("P> wait() returned this: ", w, "\n");
}
else
{
sleep(2);
if (childID == -1)
error("C> An error occurred.\n");
else
{
princ("C> I am the child process.\nC> My process ID is: ",
getpid(), "\n");
sleep(2);
princ("C> Time to exit.\n");
exit_program(3);
}
}Will produce these results:
P> My ID is: 1225 P> My child's ID is: 1226 P> Waiting for my child.
(after 2 seconds)
C> I am the child process. C> My process ID is: 1226
(after 2 more seconds)
C> Time to exit. P> Signal received that my child -- 1226 -- has died. P> wait() returned this: (1226 3 nil nil)