2010-10-08 97 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