title | author | institute | date | theme | header-includes | |
---|---|---|---|---|---|---|
Signal |
Praktikum Sistem Operasi |
Ilmu Komputer IPB |
2023 |
Dresden |
|
-
Bentuk komunikasi antarproses (IPC) yang paling sederhana.
-
Contoh IPC yang lain1:
- pipe
- shared memory
- message passing
- socket
-
Ada 31 jenis sinyal standar2.
-
Berikut sinyal yang dapat dikirim oleh user ke proses:
Ctrl-C
: sinyal interrupt (SIGINT
)Ctrl-Z
: sinyal stop (SIGTSTP
), bisa dilanjutkan lagiCtrl-\
: sinyal quit (SIGQUIT
)
#define SIGHUP 1 // hangup
#define SIGINT 2 // interrupt
#define SIGQUIT 3 // quit
#define SIGILL 4 // illegal instruction
#define SIGTRAP 5 // trace trap
#define SIGABRT 6 // abort
#define SIGBUS 7 // bus error
#define SIGFPE 8 // floating-point exception
#define SIGKILL 9 // kill, unblockable
#define SIGUSR1 10 // user-defined signal 1
#define SIGSEGV 11 // segmentation violation
#define SIGUSR2 12 // user-defined signal 2
#define SIGPIPE 13 // broken pipe
#define SIGALRM 14 // alarm clock
#define SIGTERM 15 // termination
#define SIGSTKFLT 16 // stack fault
#define SIGCHLD 17 // child terminated/stopped
#define SIGCONT 18 // continue
#define SIGSTOP 19 // stop, unblockable
#define SIGTSTP 20 // terminal stop
#define SIGTTIN 21 // background read from tty
#define SIGTTOU 22 // background write to tty
#define SIGURG 23 // urgent data on socket
#define SIGXCPU 24 // CPU time limit exceeded
#define SIGXFSZ 25 // file size limit exceeded
#define SIGVTALRM 26 // virtual timer expired
#define SIGPROF 27 // profiling timer expired
#define SIGWINCH 28 // window size change
#define SIGPOLL 29 // pollable event occured
#define SIGPWR 30 // power failure imminent
#define SIGSYS 31 // bad system call
void signal(int signum, void function(int));
{.c}
-
Untuk menangani sinyal yang masuk3.
-
Jika ada
signum
yang masuk, makafunction
akan dijalankan.
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);
}
}
-
Jalankan program, kemudian kirim
SIGINT
(tekanCtrl-C
). -
Karena ada
SIGINT
masuk, program memanggil fungsifoo
. -
Kirim lagi
SIGINT
. -
Apa yang terjadi? Mengapa demikian?
-
Apa maksud
SIG_DFL
?
int kill(pid_t pid, int signum);
{.c}
- Untuk mengirim sinyal
signum
ke prosespid
4.
\label{kill}
int main()
{
pid_t child = fork();
if (child == 0) {
while (1) {
puts("child");
sleep(1);
}
} else {
sleep(5);
kill(child, SIGTERM); // terminate
}
return 0;
}
-
Child akan terus mencetak tiap 1 detik.
-
Setelah 5 detik, parent mengirim
SIGTERM
ke child. -
Child akan berhenti karena mendapat
SIGTERM
dari parent.
int pause(void);
{.c}
- Untuk menunggu sampai ada sinyal yang masuk5.
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;
}
-
Parent menunggu sinyal masuk.
-
Child akan mengirim
SIGALRM
ke parent setelah 5 detik. -
Setelah
SIGALRM
masuk, parent memanggil fungsiding
. -
Apa yang terjadi jika parent tidak memanggil fungsi
pause()
?
- Modifikasi program contoh (p\ref{kill}) pada bagian parent, sehingga child akan:
- berjalan selama 4 detik, lalu
- berhenti sementara selama 3 detik, lalu
- lanjut lagi berjalan selama 2 detik, lalu
- selesai
- Tunjukkan ke asprak untuk dinilai
- Kumpulkan hasil akhirnya ke LMS (file
[NIM].c
)