【问题标题】:Running a new child process in background C linux在后台 C linux 中运行一个新的子进程
【发布时间】:2012-06-11 13:08:25
【问题描述】:

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

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

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

有什么解决办法吗?

【问题讨论】:

    标签: c linux process background fork


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      问题在于& 不是程序的命令行选项。相反,它只是将命令置于后台的特殊 shell 语法。后台程序的显着特点是它们没有连接到终端,并且终端不等待进程完成。正确的函数是daemon()。发送man daemon 以了解其使用方法。

      【讨论】:

      • 不好意思挑剔:daemon(3) 不是一个系统调用,它是一个库函数(通过双重fork和@实现987654326@ 系统调用 - 在man 页的第 2 节中列出)。事实上,daemon 是合适的函数。
      • 嗯,你似乎是对的。自从我进行 UNIX 编程以来已经有一段时间了,但我记得它被呈现为系统调用,显然是错误的。无论如何,适当的参考是史蒂文斯的书,它指出了这种等价性(iirc,因为我的手册页没有)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2011-05-30
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        相关资源
        最近更新 更多