0

我正在尝试在后台运行一个新进程,以便可以继续使用父进程。

我用fork然后execl。我试图在 execl 命令中添加参数 & 但它不起作用:

execl("newproc","newproc","arg1","&",NULL);

有什么解决办法吗?

4

3 回答 3

4

自从您使用fork. 子进程将继续与父进程并行运行(如果exec成功)。如果您关心子进程是否成功(并且您的代码应该),您最终应该调用waitpid以收集其退出状态。否则,您应该调用fork 两次并让中间进程退出而无需wait为子进程退出,以便init采用孙进程。

正如@mah 所说,这&是不必要的。但是该行需要进行另一项更改;execl是一个可变参数函数,因此函数原型不负责将参数转换为正确的类型。因此,最后一个参数应该作为正确的类型传递——只需将其更改为(char*)NULL.

您提到您的代码不起作用。虽然这可能只是因为 spurious &,但也可能是因为第一个论点。该execl函数不搜索$PATH命名程序,因此除非newproc实际上在当前目录中,否则此execl()调用将返回。返回时execl,始终表明存在问题。解决此问题的最简单方法是使用execlp()而不是execl(). 另一种方法是指定绝对路径作为第一个参数。您甚至可以指定一个相对路径作为第一个参数,但这很少有用。

于 2012-06-10T21:19:41.680 回答
2

&不是命令参数,它是 shell 用来知道在后台运行命令的标志。在这种情况下,您正在执行外壳的工作...删除&. 既然你说你已经调用fork()了,只要你只execl()在 fork 返回后在子进程中执行,你就已经在后台运行了。

于 2012-06-10T21:06:08.427 回答
2

问题是这&不是程序的命令行选项。相反,它只是将命令置于后台的特殊 shell 语法。后台程序的显着特点是它们没有连接到终端,并且终端不等待进程完成。正确的功能是daemon()。做一个man daemon阅读它是如何使用的。

于 2012-06-10T21:06:16.463 回答