如何使用vfork在uClinux中生成守护进程?
使用fork()很容易,但我没有MMU。我听说vWork()会阻止父进程,直到子进程退出或执行exec()。我怎样才能完成这样的事情如何使用vfork在uClinux中生成守护进程?,c,linux,fork,uclinux,C,Linux,Fork,Uclinux,使用fork()很容易,但我没有MMU。我听说vWork()会阻止父进程,直到子进程退出或执行exec()。我怎样才能完成这样的事情 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 some
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.....
似乎没有办法做到这一点,正如你在这里<必须调用code>exec或
\u exit
才能让父级继续执行。将守护程序代码放入另一个可执行文件并执行它,或者使用子任务生成原始任务。第二种方法是鬼鬼祟祟的方法,在这里介绍。
无法使用vWork()执行守护进程()。要在上创建类似于守护进程的东西!MMU使用vfork(),父进程不会死(因此有额外的进程),您应该在后台调用守护进程(即通过在shell的命令行中附加&来实现)
另一方面,Linux提供了clone()。有了这些、知识和关心,就有可能为您实现daemon()!嗯。Jamie Lokier在ARM和i386上有一个功能,从中获取
编辑:为您创建了指向Jamie Lokier的守护进程()的链接!MMU Linux更突出。我本以为这是许多其他人以前遇到的问题,但我很难找到任何人谈论“杀死父母”问题 我最初认为,您应该能够通过对
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_堆栈和child_func以vfork的方式工作是相当困难的,因为child_func需要是克隆调用的返回地址,并且child_堆栈需要是实际系统调用(sys_clone)进行时堆栈的顶部
您可能可以尝试直接使用调用sys\u clone
pid_t new_vfork(void) {
return sys_clone( SIGCHLD | CLONE_VM, NULL);
}
我想这可能会得到你想要的。传递NULL作为第二个参数,即child_堆栈指针,会导致内核执行与vfork和fork中相同的操作,即使用与父堆栈相同的堆栈
我从未直接使用过sys\u clone
,也没有对此进行过测试,但我认为它应该可以工作。我认为:
sys_clone( SIGCHLD | CLONE_VM | CLONE_VFORK, NULL);
相当于vWork
如果这不起作用(而且你也不知道如何做类似的事情),那么你可以使用常规的克隆调用以及
setjump
和longjmp
调用来模拟它,或者你可以绕过“返回两次”的需要fork
和vfork
的语义一个转折点是使用一个多调用二进制文件,这样就不需要将二进制代码放入另一个可执行文件中。我相信URL应该是,我想知道这是否会遇到这里描述的问题:可能会。另外,我还没有找到sys\u clone
库函数。不过,如果能有,那当然很好。