在后台C linux中运行新的子进程
我正在尝试在后台运行一个新进程,以便可以继续使用父进程 我用叉子,然后用execl。我试图将参数添加到execl命令中&但它不起作用:在后台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("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)
不是一个系统调用,它是一个库函数(通过dualfork
和close
syscalls实现-在man
页面的第2节中列出)。实际上,守护进程
是合适的函数。嗯,你似乎是对的。我已经有一段时间没有做过UNIX编程了,但我记得它是以系统调用的形式出现的,显然是错误的。在任何情况下,合适的参考文献是史蒂文斯的书,它指出了这种等价性(iirc,我的手册页没有)