如何在C中在后台执行进程?

如何在C中在后台执行进程?,c,process,exec,C,Process,Exec,我已经对一个进程执行了fork和exec(),但我想在后台运行它。我该怎么做? 我可以避免对它调用waitpid,但是这个进程永远都在那里,等待将它的状态返回给父进程。还有其他方法吗?Fork创建后台线程,然后执行。请参阅此站点上的重复问题:waitpid(-1,&status,WNOHANG)可能会执行您需要的操作:如果没有子进程退出,它应该立即返回。或者,您可以监听SIGCHLD信号。我认为您要做的是创建一个守护进程。请阅读维基百科上的链接以获得解释 使进程成为守护进程的示例(来自Steve

我已经对一个进程执行了fork和exec(),但我想在后台运行它。我该怎么做?
我可以避免对它调用waitpid,但是这个进程永远都在那里,等待将它的状态返回给父进程。还有其他方法吗?

Fork创建后台线程,然后执行。请参阅此站点上的重复问题:

waitpid(-1,&status,WNOHANG)
可能会执行您需要的操作:如果没有子进程退出,它应该立即返回。或者,您可以监听SIGCHLD信号。

我认为您要做的是创建一个守护进程。请阅读维基百科上的链接以获得解释

使进程成为守护进程的示例(来自Steven在Unix环境中的高级编程)是:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h> 

int daemon_int(void)
{
    pid_t pid;
    if ((pid = fork()) < 0)
        return (-1) ;
    else if (pid != 0)
       exit(0) ; /* The parent process exits */
    setsid() ;   /* become session leader */
    chdir("/") ; /* change the working dir */
    umask(0) ;   /* clear out the file mode creation mask */
    return(0) ;
}
#包括
#包括
#包括
int守护进程_int(无效)
{
pid_t pid;
如果((pid=fork())<0)
返回(-1);
否则如果(pid!=0)
退出(0);/*父进程退出*/
setsid();/*成为会话负责人*/
chdir(“/”;/*更改工作目录*/
umask(0);/*清除文件模式创建掩码*/
返回(0);
}
当然,这确实假设了一个类似Unix的操作系统


因此,您的程序包含上述函数,并在运行时立即调用它。然后,它将与父进程解除关联,并将继续运行,直到终止或终止。

Catch SIGCHLD,并在处理程序中调用wait()


Posix的一些风格(我认为是*BSD,但不要引用我的话),如果忽略SIGCHLD,内核将自动清理僵尸进程(这是您在ps中看到的)。这是一个不错的功能,但不可移植。

是的,我看到了这个问题,但它仍然没有回答我原来的问题。当然,我可以避免等待呼叫,但是过程永远都在那里。我每次运行ps-al时都能看到它。我不认为过去问题的答案实际上回答了这个问题(正如aditya也抱怨的那样);阿维给出了正确的答案。此外,我怀疑过去问题的答案是否真的回答了过去的问题(因为OP还想创建一个后台流程,没有人告诉他关于double fork)。这不是一个好策略-除非父流程准备一次又一次地这样做(否则你最终还是会变成僵尸).不幸的是,我得到的结果与Martin预测的完全一致,但在那之前听起来确实不错。这一切都取决于父进程的结构。有时候偶尔投票比抓住西格尔德更容易。嗯,仔细阅读这个问题让我觉得阿维可能有答案。或者,您可以使第一个子代成为等待孙辈终止的守护进程。因此,请断开父级和子级之间的链接,以便父级可以终止,而不会导致子级和孙级退出。如果要执行此操作,还需要原始进程调用wait()以获取其子级。由于子进程将很快退出(在派生孙进程之后),您的原始进程将不会阻塞长时间等待()。这是要实现的最干净的解决方案。谢谢对于未来有同样问题的程序员,我在“UNIX环境中的高级编程”第293页上找到了以下内容:每当进程终止或停止时,SIGCHLD信号都会发送给父进程。默认情况下,此信号被忽略,因此如果家长希望在孩子的状态更改时收到通知,则必须捕获此信号。信号捕获函数中的正常操作是调用其中一个等待函数来获取子进程ID和终止状态。在本例中,我只需要一行liw.fi建议的代码:waitpid(-1,&status,WNOHANG | WUNTRACED);