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

在后台C linux中运行新的子进程,c,linux,process,background,fork,C,Linux,Process,Background,Fork,我正在尝试在后台运行一个新进程,以便可以继续使用父进程 我用叉子,然后用execl。我试图将参数添加到execl命令中&但它不起作用: execl("newproc","newproc","arg1","&",NULL); 有什么解决方案吗?&不是命令参数,而是shell在后台运行命令时使用的标志。在本例中,您正在执行shell的工作。。。卸下和。由于您声明调用了fork(),只要在fork返回后只在子进程中执行execl(),您就已经在后台运行了。问题在于&不是程序的命令行选项。相反

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

我用叉子,然后用execl。我试图将参数添加到execl命令中&但它不起作用:

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

有什么解决方案吗?

&
不是命令参数,而是shell在后台运行命令时使用的标志。在本例中,您正在执行shell的工作。。。卸下
。由于您声明调用了
fork()
,只要在fork返回后只在子进程中执行
execl()
,您就已经在后台运行了。

问题在于
&
不是程序的命令行选项。相反,它只是将命令置于后台的特殊shell语法。后台程序的显著特点是它们没有连接到终端,终端也没有等待进程完成。正确的函数是
daemon()
。做一个
人工守护进程
来了解它是如何使用的。

由于您使用了
fork
,子进程将在后台运行。子级将保持与父级并行运行(如果
exec
成功)。如果您关心子进程是否成功(并且您的代码应该成功),那么最终应该调用
waitpid
来收集其退出状态。否则,您应该调用
fork
两次,并让中间进程退出,而不等待子进程,以便
init
采用孙进程

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


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

很抱歉,我要挑三拣四:
daemon(3)
不是一个系统调用,它是一个库函数(通过dual
fork
close
syscalls实现-在
man
页面的第2节中列出)。实际上,
守护进程
是合适的函数。嗯,你似乎是对的。我已经有一段时间没有做过UNIX编程了,但我记得它是以系统调用的形式出现的,显然是错误的。在任何情况下,合适的参考文献是史蒂文斯的书,它指出了这种等价性(iirc,我的手册页没有)