2016年4月8日 星期五

Fork() function in While() with Endless

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 process
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;
}

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 process
while (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。

沒有留言:

張貼留言