# 2018q3 Homework1
contributed by < `tony30701` >
###### tags: `sysprog2018`
---
### 選擇研究的題材
* 你所不知道的C語言
* 為什麼要深入學習 C 語言? (2017.05)
* 指標篇 (2015.11) (2016.09) (2018.02)
* C Traps and Pitfalls
* Signal的呼叫方式
## 你所不知道的C語言
#### 為什麼要深入學習 C 語言?
#### 指標篇
- [ ] 取自 [C Traps and Pitfalls](http://www.literateprogramming.com/ctraps.pdf) 的案例 “Understanding Declarations”
- [ ] signal的呼叫方式
> sighandler_t signal(int signum, sighandler_t handler);
> 以下程式碼的運作使用signal函式接收3種不同的訊號, 分別為SIGINT, SIGQUIT, SIGUSR1, 收到訊號時則啟動不同的signal handler來執行對應的行動。

```clike
#include <stdio.h>
#include <signal.h>
void signal_handler2(int sig_num) {
printf("Hello world from signal handler 2, sig_num: %d\n", sig_num);
}
void signal_handler1(int sig_num) {
printf("Hello world from signal handler 1, sig_num: %d\n", sig_num);
signal(SIGQUIT, signal_handler2);
}
void signal_handler(int sig_num) {
printf("Hello world from signal handler, signum: %d\n", sig_num);
}
int main() {
signal(SIGINT, signal_handler1);
// SIGUSR1
signal(SIGUSR1, signal_handler);
raise(SIGUSR1);
raise(SIGUSR1);
while (1) ;
return 0;
}
```
```shell
root@ubuntu:~/8_NCKU_system_software_2018/week1# killall --signal 2 hello_signal
root@ubuntu:~/8_NCKU_system_software_2018/week1# killall --signal 3 hello_signal
root@ubuntu:~/8_NCKU_system_software_2018/week1# killall --signal 10 hello_signal
root@ubuntu:~/8_NCKU_system_software_2018/week1# killall --signal 3 hello_signal
root@ubuntu:~/8_NCKU_system_software_2018/week1# killall --signal 2 hello_signal
Output:
root@ubuntu:~/8_NCKU_system_software_2018/week1# ./hello_signal
Hello world from signal handler, signum: 10
Hello world from signal handler, signum: 10
Hello world from signal handler 1, sig_num: 2
Hello world from signal handler 2, sig_num: 3
Hello world from signal handler, signum: 10
Hello world from signal handler 2, sig_num: 3
Hello world from signal handler 1, sig_num: 2
```
:::warning
避免用 root 權限執行程式
:notes: jserv
:::
> 收到 by tony30701
[Ref] https://www.usna.edu/Users/cs/aviv/classes/ic221/s16/lec/19/lec.html
- [ ]