waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"
TRANSCRIPT
![Page 1: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/1.jpg)
����������������������
�������������������������wait������������������������������������������������������������������
#include "csapp.h" int main() { pid_t pid; pid = Fork(); if (pid == 0) { Sleep(3); } else { int status; while (Wait(&status) != pid) { printf("Tick...\n"); Sleep(1); } } return 0;}
����
�
![Page 2: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/2.jpg)
����������������������
����WNOHANG���������������waitpid���������������������������������������0����������������������������������
#include "csapp.h" int main() { pid_t pid; pid = Fork(); if (pid == 0) { Sleep(3); } else { int status; while (Waitpid(pid, &status, WNOHANG) != pid) { printf("Tick...\n"); Sleep(1); } } return 0;}
����
�
![Page 3: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/3.jpg)
�������
��signal����������������������������������������������������������������������pulling������������
���
![Page 4: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/4.jpg)
�������
��signal����������������������������������������������������������������������pulling������������
�����������
�
![Page 5: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/5.jpg)
�������
��signal����������������������������������������������������������������������pulling������������
�����������
�������������
SIGINT = 2 �����SIGKILL = 9 ��������kill -9SIGALRM = 14 �������������SIGTERM = 15 ��������killSIGCHLD = 20 �������������������
���
![Page 6: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/6.jpg)
�����������������
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
�����handler�������������������������������������signum
�������������������� SIG_IGN���������� SIG_DFL��������������������������������signum
�������������������������SIGKILL
�
![Page 7: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/7.jpg)
���������������
#include <sys/types.h>#include <signal.h> int kill(pid_t pid, int signum);
������signum����pid
������������������������ ⇒ �������������SIGCHLD
���������������� ⇒ ������������SIGINT
$ kill pid ⇒ kill�������SIGTERM
$ kill -9 pid ⇒ kill�������SIGKILL
����
![Page 8: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/8.jpg)
���������������
#include "csapp.h" void done(int sigchld) { int status; Wait(&status); sio_puts("done\n");} int main() { Signal(SIGCHLD, done); if (Fork() == 0) { Sleep(3); exit(0); } else { while (1) { printf("Tick...\n"); Sleep(1); } }}
����
��
![Page 9: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/9.jpg)
�����������������
� ��������������������������������������������������������
� �������������������������������������������pendingdelivered�����������������������������������������
� ������������������������������������
�������������������������������⇒������������
� ����������������blocked������������������
����������������⇒������������������������������
� ��������������������������������������
�����
![Page 10: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/10.jpg)
�������������
������ ������� ������� �������SIGHUP 0 0 SIG_DFLSIGINT 1 1 handle_ctl_cSIGQUIT 0 1 handle_quitSIGILL 1 0 give_upSIGTRAP 0 0 SIG_DFL���
���������������������������give_up������
������ ������� ������� �������SIGHUP 0 0 SIG_DFLSIGINT 1 1 handle_ctl_cSIGQUIT 0 1 handle_quitSIGILL 0 1 give_upSIGTRAP 0 0 SIG_DFL���
�����
![Page 11: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/11.jpg)
�������������
������ ������� ������� �������SIGHUP 0 0 SIG_DFLSIGINT 1 1 handle_ctl_cSIGQUIT 0 1 handle_quitSIGILL 1 0 give_upSIGTRAP 0 0 SIG_DFL���
���������������������������give_up������
������ ������� ������� �������SIGHUP 0 0 SIG_DFLSIGINT 1 1 handle_ctl_cSIGQUIT 0 1 handle_quitSIGILL 0 1 give_upSIGTRAP 0 0 SIG_DFL���
��������������������������������������������������
��
![Page 12: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/12.jpg)
�������������
������ ������� ������� �������SIGHUP 0 0 SIG_DFLSIGINT 1 1 handle_ctl_cSIGQUIT 0 1 handle_quitSIGILL 1 0 give_upSIGTRAP 0 0 SIG_DFL���
���������������������������give_up������
������ ������� ������� �������SIGHUP 0 0 SIG_DFLSIGINT 1 1 handle_ctl_cSIGQUIT 0 1 handle_quitSIGILL 0 1 give_upSIGTRAP 0 0 SIG_DFL���
��������������������������������������������������������
��
![Page 13: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/13.jpg)
�����������
#include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
������������signal mask�������������������������������������
� how���SIG_BLOCK�������������
� how���SIG_UNBLOCK������������������
� how���SIG_SETMASK����������
int sigemptyset(sigset_t *set);int sigaddset(sigset_t *set, int signum);int sigdelset(sigset_t *set, int signum);
�����
![Page 14: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/14.jpg)
�������������
#include "csapp.h" static void hit(int sigchld) { sio_puts("got Ctl-c\n");} int main() { sigset_t sigs; Sigemptyset(&sigs); Sigaddset(&sigs, SIGINT); Signal(SIGINT, hit); while (1) { // Sigprocmask(SIG_BLOCK, &sigs, NULL); Sleep(1); // Sigprocmask(SIG_UNBLOCK, &sigs, NULL); printf("Tick\n"); }}
����
����������⇒����� ���� �� ����
��������������
��������������⇒�����������������
sleep�����������
⇒�����������������
��������⇒������������������sleep
��
![Page 15: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/15.jpg)
��������������������
#include "csapp.h" static int child_running = 0; void done(int sigchld) { int status; Wait(&status); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; if (Fork() == 0) { Sleep(3); printf("done\n"); exit(0); } } printf("Tick...\n"); Sleep(1); }}
����
�������������������������������������������������������������������������������������
��
![Page 16: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/16.jpg)
��������������������
#include "csapp.h" static int child_running = 0; void done(int sigchld) { int status; Wait(&status); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; if (Fork() == 0) { Sleep(3); printf("done\n"); exit(0); } } printf("Tick...\n"); Sleep(1); }}
����
�������������������������������������������������������������������������������������
�������������������������printf����Sleep�������������������-O2
��
![Page 17: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/17.jpg)
��������������������
#include "csapp.h" static int child_running = 0; void done(int sigchld) { int status; Wait(&status); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; if (Fork() == 0) { Sleep(3); printf("done\n"); exit(0); } } printf("Tick...\n"); Sleep(1); }}
����
�������������������������������������������������������������������������������������
�������������������������printf����Sleep�������������������-O2
⇒ �����volatile���child_running
������������������������������������������������������������������volatile
��
![Page 18: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/18.jpg)
������������������������������
#include "csapp.h" static volatile int child_running = 0;static volatile pid_t pid = 0; void done(int sigchld) { int status; Waitpid(pid, &status, 0); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; pid = Fork(); if (pid == 0) return 0; } }}
����
��
![Page 19: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/19.jpg)
������������������������������
#include "csapp.h" static volatile int child_running = 0;static volatile pid_t pid = 0; void done(int sigchld) { int status; Waitpid(pid, &status, 0); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; pid = Fork(); if (pid == 0) return 0; } }}
����
Signal
return
Fork pid=
��
![Page 20: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/20.jpg)
������������������������������
#include "csapp.h" static volatile int child_running = 0;static volatile pid_t pid = 0; void done(int sigchld) { int status; Waitpid(pid, &status, 0); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; pid = Fork(); if (pid == 0) return 0; } }}
����
Signal
return
Fork pid=
waitpid(pid, ...)
��
![Page 21: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/21.jpg)
������������������������������
#include "csapp.h" static volatile int child_running = 0;static volatile pid_t pid = 0; void done(int sigchld) { int status; Waitpid(pid, &status, 0); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; pid = Fork(); if (pid == 0) return 0; } }}
����
Signal
return
Fork pid=
waitpid(pid, ...)
��
![Page 22: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/22.jpg)
������������������������������
#include "csapp.h" static volatile int child_running = 0;static volatile pid_t pid = 0; void done(int sigchld) { int status; Waitpid(pid, &status, 0); child_running = 0;} int main() { Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; pid = Fork(); if (pid == 0) return 0; } }}
����
Signal
return
Fork pid=
waitpid(pid, ...)
����������block���������������pid = Fork()
��
![Page 23: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/23.jpg)
���������SIGCHLD���������
int main() { sigset_t sigs; Sigemptyset(&sigs); Sigaddset(&sigs, SIGCHLD); Signal(SIGCHLD, done); while (1) { if (!child_running) { child_running = 1; Sigprocmask(SIG_BLOCK, &sigs, NULL); pid = Fork(); Sigprocmask(SIG_UNBLOCK, &sigs, NULL); if (pid == 0) return 0; } }}
����
��
![Page 24: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/24.jpg)
�����������������
#include "csapp.h" static void ack(int sigchld) { printf("got alarm\n"); } int main() { Signal(SIGALRM, ack); if (Fork() == 0) { while (1) Kill(getppid(), SIGALRM); } else { double a = 1.0; while (1) { printf("%f ", a); a = a + 1.0; } }}
����
��
![Page 25: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/25.jpg)
�����������������
#include "csapp.h" static void ack(int sigchld) { printf("got alarm\n"); } int main() { Signal(SIGALRM, ack); if (Fork() == 0) { while (1) Kill(getppid(), SIGALRM); } else { double a = 1.0; while (1) { printf("%f ", a); a = a + 1.0; } }}
����
������������������
printf��������async-signal-safe
��
![Page 26: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/26.jpg)
�����������������
#include "csapp.h" static void ack(int sigchld) { sio_puts("got alarm\n"); } int main() { Signal(SIGALRM, ack); if (Fork() == 0) { while (1) Kill(getppid(), SIGALRM); } else { double a = 1.0; while (1) { printf("%f ", a); a = a + 1.0; } }}
����
sio_puts������csapp.c�������������������������������������
��
![Page 27: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/27.jpg)
��������������������errno
#include "csapp.h" static void ack(int sigchld) { /* broken; sets errno to ECHILD: */ waitpid(getpid(), NULL, 0);} int main() { Signal(SIGALRM, ack); if (Fork() == 0) { while (1) Kill(getppid(), SIGALRM); } else { while (1) { /* broken; should set errno to ENOENT */
open("not_there.txt", O_RDONLY); if (errno == ECHILD) printf("ECHILD from open?!\n"); } }}
����
����������������� �������������������������errno
⇒������errno��������������������errno��������
�����
![Page 28: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/28.jpg)
������������������������������������
� ����������������������������������������
� �������������������������������������������������
� �����������������errno������������������
� ����������������������������volatile
� �������������������������������������������������������
�����������������������Computer Systems: A Programmer’s Perspective�����������������
![Page 29: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/29.jpg)
�������������������
�������������������������������������
Waitpid(pid, &status, 0);
���������������������������������������������������
/* ... install handlers to set ctl_c_hit and child_finished ... */ while (!ctl_c_hit && !child_finished) { }
Busy waiting��������������������������
�����
![Page 30: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/30.jpg)
sigsuspend
#include <signal.h> int sigsuspend(const sigset_t *mask);
Atomically�������������������������mask��������������������������������������
����������mask����������������������
�����������������������������������������
��
![Page 31: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/31.jpg)
������sigsuspend
#include "csapp.h" static void hit(int sigchld) { sio_puts("got Ctl-c\n"); }static void work() { Sleep(1); } /* simulate useful work */ int main() { sigset_t sigs, empty_mask; Sigemptyset(&sigs); Sigemptyset(&empty_mask); Signal(SIGINT, hit); Sigaddset(&sigs, SIGINT); Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigsuspend(&empty_mask);
return 0;}
����
��
![Page 32: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/32.jpg)
������sigsuspend
#include "csapp.h" static void hit(int sigchld) { sio_puts("got Ctl-c\n"); }static void work() { Sleep(1); } /* simulate useful work */ int main() { sigset_t sigs, empty_mask; Sigemptyset(&sigs); Sigemptyset(&empty_mask); Signal(SIGINT, hit); Sigaddset(&sigs, SIGINT); Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigsuspend(&empty_mask);
return 0;}
����
�����
Sigprocmask work Sigsuspend return��
![Page 33: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/33.jpg)
������sigsuspend
#include "csapp.h" static void hit(int sigchld) { sio_puts("got Ctl-c\n"); }static void work() { Sleep(1); } /* simulate useful work */ int main() { sigset_t sigs, empty_mask; Sigemptyset(&sigs); Sigemptyset(&empty_mask); Signal(SIGINT, hit); Sigaddset(&sigs, SIGINT); Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigsuspend(&empty_mask);
return 0;}
����
�����
Sigprocmask work Sigsuspend return��
![Page 34: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/34.jpg)
������sigsuspend
#include "csapp.h" static void hit(int sigchld) { sio_puts("got Ctl-c\n"); }static void work() { Sleep(1); } /* simulate useful work */ int main() { sigset_t sigs, empty_mask; Sigemptyset(&sigs); Sigemptyset(&empty_mask); Signal(SIGINT, hit); Sigaddset(&sigs, SIGINT); Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigsuspend(&empty_mask);
return 0;}
����
�����
Sigprocmask work Sigsuspend return��
![Page 35: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/35.jpg)
���������sleep����sigsuspend
������sleep��������������������������
Sigaddset(&sigs, SIGINT);Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigprocmask(SIG_SETMASK, &empty_mask, NULL);while (Sleep(1000) == 0) { }
����
��
![Page 36: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/36.jpg)
���������sleep����sigsuspend
������sleep��������������������������
Sigaddset(&sigs, SIGINT);Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigprocmask(SIG_SETMASK, &empty_mask, NULL);while (Sleep(1000) == 0) { }
����
�����
Sigprocmask work Sigprocmask Sleep return
��
![Page 37: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/37.jpg)
���������sleep����sigsuspend
������sleep��������������������������
Sigaddset(&sigs, SIGINT);Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigprocmask(SIG_SETMASK, &empty_mask, NULL);while (Sleep(1000) == 0) { }
����
�����
Sigprocmask work Sigprocmask Sleep return
��
![Page 38: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/38.jpg)
���������sleep����sigsuspend
������sleep��������������������������
Sigaddset(&sigs, SIGINT);Sigprocmask(SIG_BLOCK, &sigs, NULL); work(); Sigprocmask(SIG_SETMASK, &empty_mask, NULL);while (Sleep(1000) == 0) { }
����
�����
Sigprocmask work Sigprocmask Sleep return
���������������������
sigprocmask������sleep��������atomicpause���������������������
�����
![Page 39: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/39.jpg)
���������������������������������
� ����sigsuspend��������������������
� ����������������������������������������������������
� ����������������������������������������������������
� ����������sleep����pause��������������������������������������������
�����
![Page 40: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/40.jpg)
�����������������
��������������
� running���
� terminated�zombie
����������������������������������������������
� stopped
��������������������SIGSTOP�����SIGCONT�����������������������������������������
signal��������������SIGSTOP��������
�������������������������������������������������������
������������������SIGTSTP������������SIGSTOP
�����
![Page 41: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/41.jpg)
����������������������������
$ /bin/cathihi^Z[1]+ Stopped /bin/cat$ ps ax | grep /bin/cat13388 pts/0 T 0:00 /bin/cat13393 pts/0 S+ 0:00 grep --color=auto /bin/cat$ fg %1/bin/cathi againhi again
��
![Page 42: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/42.jpg)
����������������������������
$ /bin/cathihi^Z[1]+ Stopped /bin/cat$ ps ax | grep /bin/cat13388 pts/0 T 0:00 /bin/cat13393 pts/0 S+ 0:00 grep --color=auto /bin/cat$ fg %1/bin/cathi againhi again
������������SIGTSTP
��
![Page 43: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/43.jpg)
����������������������������
$ /bin/cathihi^Z[1]+ Stopped /bin/cat$ ps ax | grep /bin/cat13388 pts/0 T 0:00 /bin/cat13393 pts/0 S+ 0:00 grep --color=auto /bin/cat$ fg %1/bin/cathi againhi again
T���������������
��
![Page 44: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/44.jpg)
����������������������������
$ /bin/cathihi^Z[1]+ Stopped /bin/cat$ ps ax | grep /bin/cat13388 pts/0 T 0:00 /bin/cat13393 pts/0 S+ 0:00 grep --color=auto /bin/cat$ fg %1/bin/cathi againhi again
fg %1�������SIGCONT
��
![Page 45: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/45.jpg)
����������������������������
$ /bin/cathihi^Z[1]+ Stopped /bin/cat$ ps ax | grep /bin/cat13388 pts/0 T 0:00 /bin/cat13393 pts/0 S+ 0:00 grep --color=auto /bin/cat$ fg %1/bin/cathi againhi again
�������������������������
��
![Page 46: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/46.jpg)
�������������������������������
SIGCHLD���������������������������������������������
������������waitpid���������������������������������
� ����WUNTRACED��������������������������������������������WIFSTOPPED(status)
� ����WCONTINUED����������������������������������������������WIFCONTINUED(status)
�����
![Page 47: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/47.jpg)
�������������������������
����������������������������������������������process group
#include "csapp.h" void hit(int sigchld) { static int hit_once = 0; if (hit_once) _exit(0); hit_once = 1; sio_puts("ignoring first Ctl-C\n");} int main() { Signal(SIGINT, hit); Fork(); Fork(); while (1) Pause();}
����
������⇒�������������
�������������������kill������������������������������
��
![Page 48: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/48.jpg)
�����������������������
#include <unistd.h> int setpgid(pid_t pid, pid_t pgid);
��������������������������pid����gid
���������������������������
��0�����pid����gid������������������������������
setpgid(0, 0)�⇒�������������������������������
��
![Page 49: waitmflatt/past-courses/cs4400/f16/signal.pdfwait #include "csapp.h"](https://reader033.vdocument.in/reader033/viewer/2022060718/607ea4a0ba812d7e6049a209/html5/thumbnails/49.jpg)
���������������������������������
#include "csapp.h" void hit(int sigchld) { static int hits = 0; if (++hits == 9) _exit(0);} static char *const argv[] = { "/bin/cat", NULL }; int main() { pid_t pid; Signal(SIGINT, hit); pid = Fork(); if (pid == 0) { // Setpgid(0, 0); Execve(argv[0], argv, NULL); } Waitpid(pid, NULL, 0); return 0;}
����
Setpgid
⇒�/bin/cat��������������
��