我正在尝试在后台运行一个新进程,以便可以继续使用父进程。
我用fork然后execl。我试图在 execl 命令中添加参数 & 但它不起作用:
execl("newproc","newproc","arg1","&",NULL);
有什么解决办法吗?
我正在尝试在后台运行一个新进程,以便可以继续使用父进程。
我用fork然后execl。我试图在 execl 命令中添加参数 & 但它不起作用:
execl("newproc","newproc","arg1","&",NULL);
有什么解决办法吗?
自从您使用fork
. 子进程将继续与父进程并行运行(如果exec
成功)。如果您关心子进程是否成功(并且您的代码应该),您最终应该调用waitpid
以收集其退出状态。否则,您应该调用fork
两次并让中间进程退出而无需wait
为子进程退出,以便init
采用孙进程。
正如@mah 所说,这&
是不必要的。但是该行需要进行另一项更改;execl
是一个可变参数函数,因此函数原型不负责将参数转换为正确的类型。因此,最后一个参数应该作为正确的类型传递——只需将其更改为(char*)NULL
.
您提到您的代码不起作用。虽然这可能只是因为 spurious &
,但也可能是因为第一个论点。该execl
函数不搜索$PATH
命名程序,因此除非newproc
实际上在当前目录中,否则此execl()
调用将返回。返回时execl
,始终表明存在问题。解决此问题的最简单方法是使用execlp()
而不是execl()
. 另一种方法是指定绝对路径作为第一个参数。您甚至可以指定一个相对路径作为第一个参数,但这很少有用。
&
不是命令参数,它是 shell 用来知道在后台运行命令的标志。在这种情况下,您正在执行外壳的工作...删除&
. 既然你说你已经调用fork()
了,只要你只execl()
在 fork 返回后在子进程中执行,你就已经在后台运行了。
问题是这&
不是程序的命令行选项。相反,它只是将命令置于后台的特殊 shell 语法。后台程序的显着特点是它们没有连接到终端,并且终端不等待进程完成。正确的功能是daemon()
。做一个man daemon
阅读它是如何使用的。