05 Process Management II - Michael Saelee's Homepage
Transcript of 05 Process Management II - Michael Saelee's Homepage
![Page 2: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/2.jpg)
Computer ScienceScience
Recall: all processes turn into zombies upon termination
- no longer runnable, but still tracked by OS kernel
2
![Page 3: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/3.jpg)
Computer ScienceScience
§Reaping Processes(& Synchronization)
3
![Page 4: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/4.jpg)
Computer ScienceScience
All processes are responsible for reaping their own (immediate) children
4
![Page 5: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/5.jpg)
Computer ScienceScience
So what happens if we don’t?
5
![Page 6: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/6.jpg)
Computer ScienceScience
$ ./a.out &Parent pid = 7254
$ ps -g 7254 PID STAT TT STAT TIME COMMAND 7254 S s003 S 0:00.01 ./a.out 7255 Z s003 Z 0:00.00 (a.out) 7256 Z s003 Z 0:00.00 (a.out) 7257 Z s003 Z 0:00.00 (a.out)
int main() { int i; for (i=0; i<3; i++) { if (fork() == 0) exit(0); } printf("Parent pid = %d\n", getpid()); while (1) ; /* non-terminating parent */}
6
![Page 7: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/7.jpg)
Computer ScienceScience
$ ./a.outParent pid = 7409
$ ps -g 7409 PID STAT TT STAT TIME COMMAND
int main() { int i; for (i=0; i<3; i++) { if (fork() == 0) exit(0); } printf("Parent pid = %d\n", getpid()); return 0; /* (parent exits) */}
7
![Page 8: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/8.jpg)
Computer ScienceScience
Q: How to kill a zombie?
A: By shooting it in the head! (i.e., terminating its parent process)
8
![Page 9: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/9.jpg)
Computer ScienceScience
Orphaned processes (i.e., with terminated parents) are adopted by the OS kernel
… and the kernel always reaps its children
9
![Page 10: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/10.jpg)
Computer ScienceScience
It is especially important for long-running processes to reap their children
(why?)
10
![Page 11: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/11.jpg)
Computer ScienceScience
int main() { int i; for (i=0; i<3; i++) { if (fork() == 0) exit(0); } printf("Parent pid = %d\n", getpid()); return 0; /* (parent exits) */}
Q: who reaps the parent??
11
![Page 12: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/12.jpg)
Computer ScienceScience
The Shell!A:
12
![Page 13: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/13.jpg)
Computer ScienceScience
int main() { printf("My parent's pid = %d\n", getppid()); printf("My own pid = %d\n", getpid()); return 0; /* terminate -> zombie */}
$ ./a.out My parent's pid = 7600My own pid = 7640
$ ps PID STAT TT STAT TIME COMMAND 7600 Ss s005 Ss 0:28.32 -bash
The Shell! (how does it do it?)
13
![Page 14: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/14.jpg)
Computer ScienceScience
pid_t reap(int *stat_loc);
(I wish)
14
![Page 15: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/15.jpg)
Computer ScienceScience
pid_t wait(int *stat_loc);
15
![Page 16: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/16.jpg)
Computer ScienceScience
pid_t wait(int *stat_loc);
when called by a process with ≥ 1 children:
- waits (if needed) for a child to terminate
- reaps a zombie child (if ≥ 1 zombified children, arbitrarily pick one)
- returns reaped child’s pid and exit status info via pointer (if non-NULL)
16
![Page 17: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/17.jpg)
Computer ScienceScience
pid_t wait(int *stat_loc);
when called by a process with no children:
- return -1 immediately & populate errno
17
![Page 18: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/18.jpg)
Computer ScienceScience
$ ./a.out &Parent pid = 7505Child pid = 7506
$ ps -g 7505 PID STAT TT STAT TIME COMMAND 7505 R s003 R 0:00.05 ./a.out
int main() { pid_t cpid; if (fork() == 0) exit(0); /* child -> zombie */ else cpid = wait(NULL); /* reaping parent */
printf("Parent pid = %d\n", getpid()); printf("Child pid = %d\n", cpid); while (1) ;}
18
![Page 19: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/19.jpg)
Computer ScienceScience
void fork9() { if (fork() == 0) { printf("HC: hello from child\n"); } else { printf("HP: hello from parent\n"); wait(NULL); printf("CT: child has terminated\n"); } printf("Bye\n");}
19
![Page 20: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/20.jpg)
Computer ScienceScience
HPCTHCByeBye
HPHCCTByeBye
HPHCByeCTBye
HCByeHPCTBye
HCHPByeCTBye
A B C D E
void fork9() { if (fork() == 0) { printf("HC: hello from child\n"); } else { printf("HP: hello from parent\n"); wait(NULL); printf("CT: child has terminated\n"); } printf("Bye\n");}
20
![Page 21: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/21.jpg)
Computer ScienceScience
wait allows us to synchronize one process with events (e.g., termination) in another
21
![Page 22: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/22.jpg)
Computer ScienceScience
int main() { if (fork() == 0) { if (fork() == 0) { printf("3"); } else { wait(NULL); printf("4"); } } else { if (fork() == 0) { printf("1"); exit(0); } printf("2"); } printf("0"); return 0; }
A. 2030401
B. 1234000
C. 2300140
D. 2034012
E. 3200410
F. 3401200
22
![Page 23: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/23.jpg)
Computer ScienceScience
int main() { int stat; if (fork() == 0) exit(1); else wait(&stat); printf("%d\n", stat); return 0; }
$ ./a.out256
23
![Page 24: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/24.jpg)
Computer ScienceScience
“status” reported by wait is more than just the exit status of the child; e.g.,
- normal/abnormal termination
- termination cause
- exit status
24
![Page 25: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/25.jpg)
Computer ScienceScience
/* macros */WIFEXITED(status) /* exited normally? */WEXITSTATUS(status) /* if so, exit status */WIFSTOPPED(status) /* process stopped? */ WIFSIGNALED(status) /* process signaled? */WTERMSIG(status) /* if so, signal number */
/* prints information about a signal */void psignal(unsigned sig, const char *s);
25
![Page 26: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/26.jpg)
Computer ScienceScience
int main() { int stat; if (fork() == 0) exit(1); else wait(&stat); if (WIFEXITED(stat)) printf("Exit status: %d\n", WEXITSTATUS(stat)); else if (WIFSIGNALED(stat)) psignal(WTERMSIG(stat), "Exit signal"); return 0; }
$ ./a.outExit status: 1
26
![Page 27: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/27.jpg)
Computer ScienceScience
int main() { int stat; if (fork() == 0) *(int *)NULL = 0; else wait(&stat); if (WIFEXITED(stat)) printf("Exit status: %d\n", WEXITSTATUS(stat)); else if (WIFSIGNALED(stat)) psignal(WTERMSIG(stat), "Exit signal"); return 0; }
$ ./a.outExit signal: Segmentation fault
27
![Page 28: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/28.jpg)
Computer ScienceSciencevoid fork10() {
int i, stat; pid_t pid[5]; for (i=0; i<5; i++) if ((pid[i] = fork()) == 0) { sleep(1); exit(100+i); } for (i=0; i<5; i++) { pid_t cpid = wait(&stat); if (WIFEXITED(stat)) printf("Child %d terminated with status %d\n", cpid, WEXITSTATUS(stat)); }}
Child 8590 terminated with status 101Child 8589 terminated with status 100Child 8593 terminated with status 104Child 8592 terminated with status 103Child 8591 terminated with status 102
28
![Page 29: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/29.jpg)
Computer ScienceScience
/* explicit waiting -- i.e., for a specific child */pid_t waitpid(pid_t pid, int *stat_loc, int options);
/** Wait options **/
/* return 0 immediately if no terminated children */#define WNOHANG 0x00000001
/* also report info about stopped children (and others) */#define WUNTRACED 0x00000002
29
![Page 30: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/30.jpg)
Computer ScienceSciencevoid fork11() {
int i, stat; pid_t pid[5]; for (i=0; i<5; i++) if ((pid[i] = fork()) == 0) { sleep(1); exit(100+i); } for (i=0; i<5; i++) { pid_t cpid = waitpid(pid[i], &stat, 0); if (WIFEXITED(stat)) printf("Child %d terminated with status %d\n", cpid, WEXITSTATUS(stat)); }}
Child 8704 terminated with status 100Child 8705 terminated with status 101Child 8706 terminated with status 102Child 8707 terminated with status 103Child 8708 terminated with status 104
30
![Page 31: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/31.jpg)
Computer ScienceScience
int main() { int stat; pid_t cpid; if (fork() == 0) { printf("Child pid = %d\n", getpid()); sleep(3); exit(1); } else { /* use with -1 to wait on any child (with options) */ while ((cpid = waitpid(-1, &stat, WNOHANG)) == 0) { sleep(1); printf("No terminated children!\n"); } printf("Reaped %d with exit status %d\n", cpid, WEXITSTATUS(stat)); }}
Child pid = 8885No terminated children!No terminated children!No terminated children!Reaped 8885 with exit status 1
31
![Page 32: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/32.jpg)
Computer ScienceScience
Recap:
- fork: create new (duplicate) process
- exit: terminate process
- wait: reap terminated (zombie) process
32
![Page 33: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/33.jpg)
Computer ScienceScience
§Running new programs(within processes)
33
![Page 34: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/34.jpg)
Computer ScienceScience
/* the "exec family" of syscalls */
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
34
![Page 35: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/35.jpg)
Computer ScienceScience
Execute a new program within the current process context
35
![Page 36: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/36.jpg)
Computer ScienceScience
Complements fork (1 call → 2 returns):
- when called, exec (if successful)never returns!
- starts execution of new program
36
![Page 37: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/37.jpg)
Computer ScienceScience
int main() { execl("/bin/echo", "/bin/echo", "hello", "world", (void *)0); printf("Done exec-ing...\n"); return 0;}
$ ./a.outhello world
37
![Page 38: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/38.jpg)
Computer ScienceScience
int main() { printf("About to exec!\n"); sleep(1); execl("./execer", "./execer", (void *)0); printf("Done exec-ing...\n"); return 0;}
$ gcc execer.c -o execer$ ./execerAbout to exec!About to exec!About to exec!About to exec!...
38
![Page 39: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/39.jpg)
Computer ScienceScience
int main () { if (fork() == 0) { execl("/bin/ls", "/bin/ls", "-l", (void *) 0); exit(0); /* in case exec fails */ } wait(NULL); printf("Command completed\n"); return 0;}
$ ./a.out-rwxr-xr-x 1 lee staff 8880 Feb 8 01:51 a.out-rw-r--r-- 1 lee staff 267 Feb 8 01:51 demo.cCommand completed
39
![Page 40: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/40.jpg)
Computer ScienceScience
Interesting question:
Why are fork & exec separate syscalls?/* i.e., why not: */fork_and_exec("/bin/ls", ...)
40
![Page 41: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/41.jpg)
Computer ScienceScience
A1: we might really want to just create duplicates of the current process (e.g.?)
41
![Page 42: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/42.jpg)
Computer ScienceScience
A2: we might want to replace the current program without creating a new process
42
![Page 43: 05 Process Management II - Michael Saelee's Homepage](https://reader031.fdocuments.net/reader031/viewer/2022012018/61dade2e0f302c27dd442bf7/html5/thumbnails/43.jpg)
Computer ScienceScience
A3 (more subtle): we might want to “tweak” a process before running a program in it
43