The fork() function is a Linux system call function.
It is used to make a new identical process from another one.
The original process becoming the parent and the new process becoming its child. The both are alive at the same time.
But when the fork() function is called, both process will terminate with the same end.
Let us see an example of the fork() function with 3 fonctions:
/* ** Made by BadproG.com */ #include <stdio.h> void begin() { puts("#############"); puts("### BEGIN ###"); puts("#############"); } void ending() { puts("##############"); puts("### ENDING ###"); puts("##############"); } int main() { begin(); puts("Here the neutral code"); fork(); puts("Here the code after fork()"); ending(); }
We compile:
cc main.c
We execute:
./a.out
Result:
############# ### BEGIN ### ############# Here the neutral code Here the code after fork() ############## ### ENDING ### ############## Here the code after fork() ############## ### ENDING ### ##############
We can see with this example of fork() that the ending() function is called twice. Uh ? Why ?
Because the fork() function split the program in two processes. And thus, we have 2 programs alive in 2 distinct processes.
The main program is executed and when fork() is called, this program finishes until the end and the second one executes also the end of the program.
So the beginning is displayed once and the end twice.
Let's see another example of the fork() function with getpid() and getppid(). We will see that the fork() function returns an integer (int).
If this int is less than 0, the fork() function did not work.
If this int is equal to 0, we are in the child process.
If this int is greater than 0, we are in the parent process.
OK, let's go:
/* ** Made by BadproG.com */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> void begin() { puts("\n#################################"); puts("### BEGIN ###"); puts("#############"); } void ending() { puts("/************/"); puts("/** ENDING **/"); puts("/*******************************/"); } int main() { int c; char *str; str = malloc(sizeof(*str)+1); begin(); puts("\n1 - Before fork()\n"); if ((c = fork()) < 0) { printf("fork() < 0 indeed fork() = %d\n", c); } else if (c > 0) { printf("fork() = %d\n", c); str = "We are inside the PARENT process because fork() > 0."; printf("getpid() = %d\n", getpid()); } else { printf("fork() = %d\n", c); str = "We are inside the CHILD process because fork() == 0."; printf("getpid() = %d\n", getpid()); } printf("%s\n", str); puts("\n2 - After fork()\n"); ending(); }
Let's compile this code:
gcc main.c
Let's execute it:
./a.out
Result:
################################# ### BEGIN ### ############# 1 - Before fork() fork() = 20326 getpid() = 20325 We are inside the PARENT process because fork() > 0. 2 - After fork() /************/ /** ENDING **/ /*******************************/ fork() = 0 getpid() = 20326 We are inside the CHILD process because fork() == 0. 2 - After fork() /************/ /** ENDING **/ /*******************************/
Now you know that a fork is not just a cover.
You are able to use it.
Well done.
Add new comment