2010-10-08 99 views
3

fork()會很容易,但我沒有MMU。我聽說vfork()阻塞父進程,直到子進程退出或執行exec()。我會如何完成這樣的事情?:如何使用vfork在uClinux中產生一個守護進程?

pid_t pid = vfork(); 

if (pid == -1) { 
    // fail 
    exit(-1); 
} 

if (pid == 0) { 
    // child 
    while(1) { 
     // Do my daemon stuff 
    } 

    // Let's pretend it exits sometime 
    exit(); 
} 

// Continue execution in parent without blocking..... 

回答

3

看起來沒有辦法完全按照您在這裏所做的。必須調用exec_exit才能繼續執行。將守護程序代碼放入另一個可執行文件中,或者使用該子代來產生原始任務。第二種方法是偷偷摸摸的方式,並在這裏描述。

+0

downvote是不應該的。 zdav是對的。 – ninjalj 2010-10-08 19:30:18

+0

一個扭曲是使用多重調用二進制文件,那麼你不需要把二進制代碼放到另一個可執行文件中。 – 2010-10-08 20:44:59

+0

我相信網址應該是http://www.ucdot.org/article.pl?sid=03/12/12/0317219&mode=thread – ninjalj 2010-10-09 15:08:44

3

daemon() function for uClinux systems without MMU and fork(), by Jamie Lokier, in patch format

你不能這樣做守護進程()用了vfork()。要使用vfork()在MMU上創建類似於守護進程的東西,父進程不會死(所以有額外的進程),並且應該在後臺調用守護進程(即通過在命令行上追加&貝殼)。

另一方面,Linux提供了clone()。有了這些知識和關心,就可以爲!MMU實現守護進程()。 Jamie Lokier有一個功能可以在ARM和i386上做到這一點,從here得到它。

編輯:使鏈接到Jamie Lokier的守護進程()for!MMU Linux更加突出。

1

我原以爲這會成爲許多其他人遇到過的問題類型,但我很難找到任何人談論「殺死父母」的問題。

我最初以爲你應該能夠有一個(不那麼,但是那種)簡單的調用做到這clone,像這樣:

pid_t new_vfork(void) { 
    return clone(child_func,  /* child function */ 
       child_stack,   /* child stack */ 
       SIGCHLD | CLONE_VM, /* flags */ 
       NULL,     /* argument to child */ 
       NULL,     /* pid of the child */ 
       NULL,     /* thread local storage for child */ 
       NULL);    /* thread id of child in child's mem */ 
} 

除了確定child_stack和child_func到工作方式與vfork的做法相當困難,因爲child_func需要成爲克隆調用的返回地址,並且child_stack需要在實際系統調用(sys_clone)創建時位於堆棧頂部。

你也許可以嘗試直接與

pid_t new_vfork(void) { 
    return sys_clone(SIGCHLD | CLONE_VM, NULL); 
} 

我想這可能會得到你想要什麼叫sys_clone。傳遞NULL作爲第二個參數,即child_stack指針,會導致內核執行與vfork和fork中相同的操作,即使用與父代相同的堆棧。

我從來沒有直接使用sys_clone,並沒有測試過這個,但我認爲它應該可以工作。我相信:

sys_clone(SIGCHLD | CLONE_VM | CLONE_VFORK, NULL); 

相當於vfork

如果這不起作用(並且您無法弄清楚如何執行類似操作),那麼您可以使用常規克隆呼叫以及setjumplongjmp調用來模擬它,或者您也許可以以避免需要「返回兩次」的語義forkvfork

+0

我不知道這是否會遭受這裏描述的問題:http:// www .mail-archive.com/uclinux-dev @ uclinux.org/msg01290.html – ninjalj 2010-10-08 21:08:55

+0

可能會。另外我一直無法找到一個'sys_clone'庫函數。不過,它肯定會很高興。 – nategoose 2010-10-08 21:13:22