Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用vfork在uClinux中生成守护进程?_C_Linux_Fork_Uclinux - Fatal编程技术网

如何使用vfork在uClinux中生成守护进程?

如何使用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

使用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 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
库函数。不过,如果能有,那当然很好。