# MP1 手寫
B07902072 資工三 陳光裕
## 1 Fork-Exec
我按照題目的要求寫了一個小程式來測試:
```
int main(void){
char *pr_n = "ls";
execlp(pr_n, pr_n, NULL, NULL, NULL);
printf("I've called the exec.\n");
return 0;
}
```
編譯並執行後發現螢幕只印出ls後的東西,代表並沒有執行到printf,這是因為當exec成功執行的時候,會去系統裡面尋找符合指定字串的執行檔,然後就執行符合字串的執行檔,不會回到我寫的程式,因此printf不會印出任何東西。
但是如果exec執行失敗,例如以下程式:
```
int main(void){
char *pr_n = "aaaals";
int n = execlp(pr_n, pr_n, NULL, NULL, NULL);
printf("I've called the exec.\n");
printf("execlp return %d", n);
return 0;
}
```
這時exec找不到名為aaaals的執行檔,exec會return -1並且回到我寫的程式繼續執行,因此就會印出printf的東西。
測試結果:

如果想要執行ls並且印出print的內容,我使用了fork來讓child跑exec、parent跑printf:
```
int main(void){
char *pr_n = "ls";
int pid = fork();
if(pid == 0){
execlp(pr_n, pr_n, NULL, NULL, NULL);
}else{
wait();
printf("I've called the exec.\n")
}
return 0;
}
```
執行結果:

## 2 Signal handled
Ans : (3)It depends.
因為fork會產生兩個process:child跟parent,在fork之後會把這兩個process送入scheduling,如果parent先被執行到了,會kill child process並送出SIGHUP,但這時候SIGHUP還未被signal register成handler,因此不會印出handler的字串;但是當child先被執行到,這時候就會被signal register,child隨後進入無窮迴圈,scheduler切換到parent並kill child,此時送出的SIGHUP是處於被register的狀態,因此就會印出handler內的字串。
我在parent裡面額外使用了sleep來模擬一個很忙碌的系統下執行child然後切換到parent的狀況:

這時就會產生先child後parent的情況:

## 3 Fork vs Thread
(1)
Fork會另外產生process,且新的process所使用到的memory不會與原本的process重疊;Thread是在同一個process之下,除了存放在stack以外的變數都共用同一個memory,因此在memory usage上Thread會小於Fork。
(2)
以Inter process communication為例,Fork會產生一個與新的process,兩個process就會出現inter process communication的問題;Thread都是在同一個process下,也就不會有此問題出現。也因此Thread不會有socket、pipe之類的ipc問題,Fork則有。