我们可以使用exec()启动后台进程吗&;作为论据?

我们可以使用exec()启动后台进程吗&;作为论据?,c,process,background,exec,unix,C,Process,Background,Exec,Unix,如果没有,我们如何在C中启动后台进程?使用调用创建一个新进程,然后使用exec()将程序加载到该进程中。有关更多信息,请参见手册页(man2fork,man2exec)。在Unix中,exec()只是故事的一部分 exec()用于在当前进程中启动新的二进制文件。这意味着当前进程中正在运行的二进制文件将不再运行 因此,在调用exec()之前,需要调用fork()来创建一个新进程,以便当前二进制文件可以继续运行 通常,要让当前二进制文件等待新进程退出,可以调用wait*()家族中的一个。该函数将使当

如果没有,我们如何在C中启动后台进程?

使用
调用创建一个新进程,然后使用exec()将程序加载到该进程中。有关更多信息,请参见手册页(
man2fork
man2exec
)。

在Unix中,exec()只是故事的一部分

exec()用于在当前进程中启动新的二进制文件。这意味着当前进程中正在运行的二进制文件将不再运行

因此,在调用exec()之前,需要调用fork()来创建一个新进程,以便当前二进制文件可以继续运行

通常,要让当前二进制文件等待新进程退出,可以调用wait*()家族中的一个。该函数将使当前进程处于休眠状态,直到等待的进程完成


因此,为了创建一个“后台”进程,您当前的进程应该跳过对wait的调用。

Fork返回子进程的PID,因此常用的习惯用法是:

if(fork() == 0)
    // I'm the child
    exec(...)

fork和exec与背景无关process@aditya当前位置您是否愿意详细介绍一下?fork()是如何创建一个新进程的,如果你想从C程序在后台运行某些东西,这就是你需要做的…@aditya fork与创建一个后台进程完全相关。你在说什么?小心,这会创建一个僵尸进程。我建议创建一个线程,然后在线程中你可以分叉并等待子线程。@Sw0ut-线程是一种非常昂贵的防止僵尸的方法。标准建议是捕获SIGCHLD,然后在信号处理程序中调用wait。@Samuel Klatchko我的程序中绝对需要一个线程,因为1。它必须是异步的(我只想在后台运行程序)2。我运行了大量的子程序,这导致了大量的僵尸(如果不阻止的话,1小时内大约6000个)。对于SIGCHLD,它没有像预期的那样工作,它似乎在等待子程序的结束,可能因为它是在主线程上运行的。