Process Duplication =================== - A new process is created using fork(). - fork() is a system call. - fork duplicates the current process. - It creates a new entry in the process table with many of same attributes as current process. - The new process (known as child process) is almost identical to original process (known as parent process). - PPID (Parent Process Identification) of new process is PID of original process. - PID (Process Identification) of new process is lowest PID available after the PID of original process .Mostly it is 1 greater than the original process(If available). - Prototype of fork :- pid_t fork(void); - Function fork() is declared in header: #include<unistd.h> - It has a return type pid_t . - System type pid_t is declared in header : #include<sys/types.h> - The Process counter of new process starts from fork() statement. - So, fork() is executed twice. - When fork() is executed by parent, it returns PID of child process on success. - When fork() is executed by child, it returns 0 for success. - If fork fails, it returns -1. - Falure may be due to :- * Limit on the number of child processes that a parent may have (CHILD_MAX), in which errno will be set to "EAGAIN"
* If process table or virtual memory is filled (not enough space), errno variable will be set to "ENOMEM". - The return value of fork() can be used to determine whether child or parent is executing. - For eg. :- #include<stdio.h> #include<unistd.h> #include<sys/types.h> int main() { pid_t fret; printf("Only parent execute\n"); fret = fork();//Fork statement printf("Both parent and child execute this statement.\n"); switch(fork) { case -1 : perror("fork"); exit(EXIT_FAILURE); break; case 0 : printf("Child executing\n"); break; default : printf("Parent executing\n"); break; } return 0; }