在后台C linux中运行一个新的子进程

时间:2012-06-10 20:59:54

标签: c linux process background fork

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

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

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

有没有解决方案?

3 个答案:

答案 0 :(得分:4)

自您使用fork后,孩子将在后台运行。孩子将与父母并行(如果exec成功)。如果您关心子进程是否成功(以及您的代码应该成功),您最终应该调用waitpid来收集其退出状态。否则,您应该调用fork 两次并让中间进程退出而不wait为子进程,以便init采用孙子进程。

正如@mah所说,&是不必要的。但是这条线需要另一个改变; execl是一个可变函数,因此函数原型不会将参数转换为正确的类型。因此,最终参数应作为正确的类型传递 - 只需将其更改为(char*)NULL

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

问题是&不是程序的命令行选项。相反,它只是特殊的shell语法,它将命令放在后台。后台程序的显着特点是它们没有连接到终端,终端不等待过程完成。正确的函数是daemon()。请man daemon阅读如何使用它。