【发布时间】:2012-06-11 13:08:25
【问题描述】:
我正在尝试在后台运行一个新进程,以便可以继续使用父进程。
我使用 fork 然后 execl。我试图在 execl 命令中添加参数 & 但它不起作用:
execl("newproc","newproc","arg1","&",NULL);
有什么解决办法吗?
【问题讨论】:
标签: c linux process background fork
我正在尝试在后台运行一个新进程,以便可以继续使用父进程。
我使用 fork 然后 execl。我试图在 execl 命令中添加参数 & 但它不起作用:
execl("newproc","newproc","arg1","&",NULL);
有什么解决办法吗?
【问题讨论】:
标签: c linux process background fork
由于您使用了fork,孩子将在后台运行。子进程将继续与父进程并行运行(如果exec 成功)。如果您关心子进程是否成功(并且您的代码应该),您最终应该调用waitpid 来收集其退出状态。否则,您应该调用fork 两次 并让中间进程退出而不为子进程提供waiting,以便init 采用孙进程。
正如@mah 所说,& 是不必要的。但是该行需要进行另一项更改; execl 是一个可变参数函数,因此函数原型不负责将参数转换为正确的类型。因此,最后的参数应该作为正确的类型传递 - 只需将其更改为 (char*)NULL。
您提到您的代码不起作用。虽然这可能只是因为虚假的&,但也可能是因为第一个论点。 execl 函数不会在 $PATH 中搜索命名程序,因此除非 newproc 实际上在当前目录中,否则此 execl() 调用将返回。当execl 返回时,始终表明存在问题。解决这个问题的最简单方法是使用execlp() 而不是execl()。另一种方法是指定绝对路径作为第一个参数。您甚至可以指定相对路径作为第一个参数,但这很少有用。
【讨论】:
问题在于& 不是程序的命令行选项。相反,它只是将命令置于后台的特殊 shell 语法。后台程序的显着特点是它们没有连接到终端,并且终端不等待进程完成。正确的函数是daemon()。发送man daemon 以了解其使用方法。
【讨论】:
daemon(3) 不是一个系统调用,它是一个库函数(通过双重fork和@实现987654326@ 系统调用 - 在man 页的第 2 节中列出)。事实上,daemon 是合适的函数。
& 不是命令参数,它是 shell 用来知道在后台运行命令的标志。在这种情况下,您正在执行 shell 的工作...删除 &。既然你说你调用了fork(),只要你在fork返回后只在子进程中执行execl(),你就已经在后台运行了。
【讨论】: