# 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的東西。 測試結果: ![](https://i.imgur.com/fVtMJU0.png) 如果想要執行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; } ``` 執行結果: ![](https://i.imgur.com/1NpGEUd.png) ## 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的狀況: ![](https://i.imgur.com/Dj0dU52.png) 這時就會產生先child後parent的情況: ![](https://i.imgur.com/PUpgTkC.png) ## 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則有。