Fork
  • pid = fork()
  • The implementation order of parent process and child process is random
  • #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        pid_t fpid;
    
        fpid = fork();
    
        if(fpid < 0)
        {
            printf("Not able to create child process ...");
            exit(1);
        }
    
        if(fpid == 0)
        {
            printf("I am the child process %d, child id is: %d\n", getpid(), fpid);
        }
        else
        {
            printf("I am the parent process %d, parent id is: %d\n", getpid(), fpid);
        }
    
        return 0;
    }
    		
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i = 0;
        pid_t fpid;
    
        printf("%10s %10s %10s %10s\n", "index", "parent", "current", "child");
    
        for(i = 0; i < 2; i++)
        {
        	fpid = fork();
    
        	if(fpid == 0)
        	{
            	printf("%10d %10d %10d %10d\n", i, getppid(), getpid(), fpid);
        	}
        	else
        	{
            	printf("%10d %10d %10d %10d\n", i, getppid(), getpid(), fpid);
        	}
        }
    
        return 0;
    }
    		
  • let parent process implement after child process is implemented
  • #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    
    int main()
    {
        pid_t fpid;
    
        fpid = fork();
    
        if(fpid == 0)
        {
            printf("I am the child process %d, child id is: %d\n", getpid(), fpid);
        }
        else
        {
            wait(&fpid);
            printf("I am the parent process %d, child id is: %d\n", getpid(), fpid);
        }
    
        return 0;
    }
    		
    execv()
  • int execl(const char *path, const char *arg, ...)
  • int execlp(const char *file, const char *arg, ...)
  • int execle(const char *path, const char *arg, ..., char *const envp[])
  • int execv(const char *path, char *const argv[])
  • int execvp(const char *file, char *const argv[])
  • int execve(const char *path, char *const argv[], char *const envp[])
  • #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    
    int main()
    {
        pid_t fpid;
    
        fpid = fork();
    
        if(fpid == 0)
        {
            printf("I am the child process %d, child id is: %d\n", getpid(), fpid);
    	char * execv_str[] = {"ls", "-l", "/home", NULL}; // ended with NULL
    	if (execv("/bin/ls",execv_str) <0 ){
    		perror("error on exec");
    		exit(1);
    	}
        }
        else
        {
            wait(&fpid);
            printf("I am the parent process %d, parent id is: %d\n", getpid(), fpid);
        }
    
        return 0;
    }
    		
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    
    int main()
    {
        pid_t fpid;
    
        fpid = fork();
    
        if(fpid == 0)
        {
    	char * execve_str[] = {"env",NULL};
    	char * env[] = {"PATH=/tmp", "USER=lchen", "STATUS=testing", NULL};
    	if (execve("/usr/bin/env",execve_str,env) <0 ){
    		perror("error on exec");
    		exit(1);
            }
        }
        else
        {
            wait(&fpid);
            printf("I am the parent process %d, parent id is: %d\n", getpid(), fpid);
        }
    
        return 0;
    }
    		
    system
  • system() automatically create a child process, does not support thread
  • exec functions support thread
  • #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        printf("Call system() to implement a child process ...");
    
        system("ls -l /home");
    
        printf("Return from the child process ...");
    
        return 0;
    }