signal()
kill()
Signal Praktikum Sistem Operasi
2016
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
Sinyal
I
sinyal merupakan salah satu bentuk komunikasi antarproses (IPC) yang paling sederhana
I
contoh IPC yang lain1 : I I I I
1
pipe socket shared memory message passing
Silberschatz et al. (2013), Operating System Concepts, hlm 130–147.
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
Jenis sinyal
I
ada 31 jenis sinyal standar2
I
beberapa sinyal dapat dikirim langsung oleh user ke proses foreground dengan menekan kombinasi tombol berikut: I I I
2
Ctrl-C: sinyal interrupt (SIGINT) Ctrl-Z: sinyal terminal stop (SIGTSTP) Ctrl-\: sinyal quit (SIGQUIT)
lihat file /usr/include/bits/signum.h dan 'man 7 signal'.
Praktikum Sistem Operasi Signal
pause()
signal()
#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define
kill()
SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT SIGBUS SIGFPE SIGKILL SIGUSR1 SIGSEGV SIGUSR2 SIGPIPE SIGALRM SIGTERM SIGSTKFLT
Praktikum Sistem Operasi Signal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// // // // // // // // // // // // // // // //
Hangup. Interrupt. Quit. Illegal instruction. Trace trap. Abort. BUS error. Floating-point exception. Kill, unblockable. User-defined signal 1. Segmentation violation. User-defined signal 2. Broken pipe. Alarm clock. Termination. Stack fault.
pause()
signal()
#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define
kill()
SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGXCPU SIGXFSZ SIGVTALRM SIGPROF SIGWINCH SIGIO SIGPWR SIGSYS
Praktikum Sistem Operasi Signal
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
// // // // // // // // // // // // // // //
pause()
Child status has changed. Continue. Stop, unblockable. Keyboard stop. Background read from tty. Background write to tty. Urgent condition on socket. CPU limit exceeded. File size limit exceeded. Virtual alarm clock. Profiling alarm clock. Window size change. I/O now possible. Power failure restart. Bad system call.
signal()
kill()
signal()
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
Fungsi signal()
signal(int signum, void function(int)); I
untuk menangani sinyal yang masuk3
I
jika ada signum yang masuk, maka function akan berjalan
3
lihat 'man 2 signal'.
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
pause()
Contoh #include <stdio.h> #include <signal.h> #include
void foo(int sig) { printf("got signal %d\n", sig); // print signum signal(SIGINT, SIG_DFL); // back to default } int main() { signal(SIGINT, foo); while (1) { puts("hello"); sleep(1); } } Praktikum Sistem Operasi Signal
signal()
kill()
Penjelasan
I
jalankan program, kemudian kirim SIGINT dengan menekan Ctrl-C
I
karena ada SIGINT yang masuk, program akan memanggil fungsi foo
I
kirim lagi SIGINT
I
apa yang terjadi? mengapa demikian?
I
apa maksud SIG_DFL?
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
kill()
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
Fungsi kill()
int kill(pid_t pid, int signum); I
4
untuk mengirim sinyal signum ke proses pid4
lihat 'man 2 kill'.
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
pause()
Contoh int main() { pid_t child = fork(); if (child == 0) { while (1) { puts("child"); sleep(1); } } else { sleep(5); kill(child, SIGTERM); } return 0; } Praktikum Sistem Operasi Signal
// terminate
signal()
kill()
Penjelasan
I
child akan berhenti setelah 5 detik berjalan karena mendapat SIGTERM dari parent
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
pause()
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
Fungsi pause()
int pause(void); I
5
untuk menunggu sampai menerima sinyal apapun5
lihat 'man 2 pause'.
Praktikum Sistem Operasi Signal
pause()
signal()
kill()
Contoh void ding(int sig) { puts("ding!"); } int main() { if (fork() == 0) { sleep(5); kill(getppid(), SIGALRM); } else { signal(SIGALRM, ding); puts("waiting..."); pause(); } return 0; } Praktikum Sistem Operasi Signal
pause()
signal()
kill()
pause()
Penjelasan
I I I I
parent menunggu sinyal masuk child akan mengirim SIGALRM ke parent setelah 5 detik setelah SIGALRM masuk, parent memanggil fungsi ding apa yang terjadi jika parent tidak memanggil fungsi pause()?
Praktikum Sistem Operasi Signal
signal()
kill()
Tugas
I
modifikasi program contoh hlm 12, sehingga child akan: I I I I
berjalan selama 4 detik, lalu berhenti sementara (stop) selama 3 detik, lalu lanjut lagi berjalan (continue) selama 2 detik, lalu berhenti (terminate)
I
jika benar, child akan mencetak 6 kali
I
kumpulkan di LMS berupa satu file dengan nama [NIM].c
Praktikum Sistem Operasi Signal
pause()