Process Creation
Systems Programming
COP-3402
Table of Contents
UNIX process creation
- Duplicate an existing process with
fork()
- Replace new process's program code
exec()
If all processes are created by fork, where does the first one come from?
Process creation workflow
LPI Figure 24-1
Fork duplicates the process
- Same program running
- Same open files (including stdio)
- "Copy" of memory
LPI Figure 24-2
If fork duplicates a process, how do we avoid both processes just doing the exact same thing?
fork()
Return Value
man fork
- PID of child to parent process
- 0 to the child process
- -1 on failure
Using fork()
fork.c
#include <stdio.h> #include <unistd.h> // fork() #include <stdlib.h> // exit() #include <inttypes.h> // intmax_t // ctrl-z and ps // man 2 fork int main(int argc, char **argv) { pid_t pid; switch (pid = fork()) { case -1: perror("fork"); exit(EXIT_FAILURE); break; case 0: // child puts("inside child process\n"); sleep(10); _exit(EXIT_SUCCESS); break; default: // parent printf("child pid: %jd\n", (intmax_t) pid); sleep(10); exit(EXIT_SUCCESS); break; } }
Using exec
exec.c
#include <stdio.h> #include <unistd.h> // fork(), execve() #include <stdlib.h> // exit() #include <inttypes.h> // intmax_t // // man 2 execve int main(int argc, char **argv) { char *prog = "/usr/bin/ls"; char *newargv[] = { NULL }; char *newenv[] = { NULL }; execve(prog, newargv, newenv); perror("execve"); _exit(EXIT_FAILURE); }
Fork and exec
fork_exec.c
#include <stdio.h> #include <unistd.h> // fork() #include <stdlib.h> // exit() #include <inttypes.h> // intmax_t // // man 2 execve int main(int argc, char **argv) { pid_t pid; switch (pid = fork()) { case -1: perror("fork"); exit(EXIT_FAILURE); break; case 0: // child puts("inside child process\n"); char *prog = "/usr/bin/ls"; char *newargv[] = { NULL, "./", NULL }; char *newenv[] = { NULL }; execve(prog, newargv, newenv); perror("execve"); _exit(EXIT_FAILURE); break; default: // parent printf("child pid: %jd\n", (intmax_t) pid); exit(EXIT_SUCCESS); break; } }