繁体   English   中英

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

[英]Running a new child process in background C linux

我正在尝试在后台运行新流程,因此可以继续使用父流程。

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

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

有什么解决办法吗?

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

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

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

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

问题在于&不是程序的命令行选项。 相反,它只是一种特殊的shell语法,它在后台放置了一个命令。 后台程序的显着特征是它们没有连接到终端,并且终端不等待该过程完成。 正确的函数是daemon() 做一个man daemon来阅读如何使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM