Fork()
前言
大家應該在學習Thread或是Process相關知識的時候,都會用到Fork或是pthread之類的功能。 就是為了要讓主程式能夠去多開一個thread進行另外一個用途,並且回傳給主程式。
ex.
以下為示意
Main()
{
永遠busy loop的做累加 (1+2+3......)
}
但是會希望同時有另外一個thread幫我檢查某個硬體訊號進來時,我可以知道並且修改目前的動作。
child_main()
{
polling Hardware signal status.
}
這時候就會讓child_main,用thread的方式,Run再平行時空下。
那大家一定會疑問,pthread跟Fork出來的有什麼差異。
簡單來說,
Fork()
pthread_create()
實做
Fork()
int main(){signal(SIGCHLD, SIG_IGN); //ignore the child fate, don't let it become zombie //這個功能在前幾篇文章有提及Zombie processpid_t pid = fork();if (pid == 0) { // child process } else if (pid > 0) { // parent process } else { //fork failed printf("fork() failed\n"); return 1; }return 0;}
pthread()
void *Compare_Copy_Thread(void *ptr){...pthread_exit((void *) S_OK);}int main() { pthread_t Thread; char *szMessage = NULL; void *hRet; pthread_create(&Thread, NULL, Compare_Copy_Thread, (void*) szMessage); pthread_join(Thread, &hRet); // wait for the Thread to terminate return 0; }
以上就是當事件觸發的時候可以使用的格式跟內容
但是以我目前會做thread的功能,是為了要減少時間跟pending。
讓系統可以在跑while loop的時候可以將我要執行的動作fork出去或是thread出去。
那這樣做會出現什麼問題呢!!!
fork ()
int main(){signal(SIGCHLD, SIG_IGN); //ignore the child fate, don't let it become zombie //這個功能在前幾篇文章有提及Zombie processwhile (1) {pid_t pid = fork();if (pid == 0) { // child process } else if (pid > 0) { // parent process } else { //fork failed printf("fork() failed\n"); return 1; }}return 0;}
接下來神奇的事情發生了!!!
child我只是想讓他做完事情後,可以結束!! 但是他其實沒有結束。
他變成新的一個process,出現在ps裡面。 那為什麼!?
因為fork會將原本叫他起來的parent process完整的複製一份。
那原本就已經在while迴圈裡面了!! 不就GG了。因為這樣會變成如下圖所示!
也就是根據第一次的迴圈,會先生成第一個child。 此時child不會死亡。
那就會有兩隻Process。
接下來兩隻Process,再繼續生成,就會再次出現一次Process。
以此類推,所以就會產生2的N次方個process。
沒有留言:
張貼留言