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