【问题标题】:system() call behaviorsystem() 调用行为
【发布时间】:2011-09-26 06:28:45
【问题描述】:

我正在使用 system() 调用来启动“tail -f”。

我看到的一件事是,tail 的调用需要 2 个进程(我可以在 ps 中看到): 1) sh -c 尾文件名 2) 尾部文件名

正如手册页所说:system() 通过调用 /bin/sh -c 命令执行命令中指定的命令。我想,过程 1) 是不可避免的,对吗?

我只是想知道是否可以将进程数从 2 个减少到 1 个。

提前致谢。

【问题讨论】:

  • 只是对您的问题标题的挑剔评论:system() 不是系统调用,而是 C 库函数。
  • @jlliagre:非常有效 - 标题已更新。

标签: c unix process system-calls


【解决方案1】:

最好使用fork()/exec() 来启动进程。 system() 调用 shell,所以你应该小心你传递给它的东西。

/* Untested code, but you get the idea */
switch ((pid = fork())) {
case -1:
    perror("fork");
    break;
case 0:
    execl("/usr/bin/tail", "tail", "-f", filename);
    perror("execl");
    exit(1);
default:
    wait(pid);
    ...
}

【讨论】:

  • 很好,除了情况0需要调用_exit(1),而不是exit(1)。
  • 等待的签名是pid_t wait(int *status)。如果您只想等待特定的 pid,则需要使用 waitpid
【解决方案2】:

系统总是执行 sh -c 命令。如果您只想要一个进程,请执行 system("exec tail -f")。

【讨论】:

  • 谢谢,但这不会也吃掉我当前的程序(我称之为tail)吗?
  • 不,它不吃当前的编。非常感谢:)
  • 不,它只会吃掉贝壳。
  • 不要这样做。按照另一个答案中的建议使用 fork() 和 exec(),这是如何在不调用 shell 的情况下正确执行另一个二进制文件。
  • 我对 fork()/exec() 的回答投了赞成票。严格来说,除非你想对你的字符串进行 shell 解析,否则它会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多