【问题标题】:Execute commands in background在后台执行命令
【发布时间】:2015-06-11 02:23:32
【问题描述】:

我正在实现一个模拟真实 bash shell 的 minishell。我忙于在后台执行命令,例如ls &。

我的第一种方法是以下(不起作用)

char *execArgs[] = { "ls", "&", NULL };
execvp("ls", execArgs);

然后,我尝试了另一种方法,修改了fork() 的父进程,而不是等待子进程,以防它应该在后台运行。这里的问题是它应该打印在后台运行的作业列表,以便在 bash shell 中模拟后台行为,但是命令 jobs 没有作为 execvp() 的参数正确执行。

我的问题是,有没有更简单的方法可以在 C 中实现这个后台调用?如果没有,我提到的任何一个选项都失败了什么?

【问题讨论】:

  • 有更好的方法,使用fork()。
  • 为了正确执行您的jobs 命令,您必须正确执行它。例如,通过跟踪所有分叉的“后台”进程。
  • 我目前正在使用 for()。如果我跟踪所有后台进程执行,我将获得什么好处?
  • 在执行jobs 时了解它们以便列出它们的好处?

标签: c linux bash shell exec


【解决方案1】:

你的例子失败的原因是

  • 您所编码的“&”是“ls”程序的参数。当您在 shell 提示符下输入命令时,“&”被 shell 使用,“ls”程序永远不会看到后台。
  • “exec()”调用会终止当前程序(即您的 mini-shell)。

你可能想要的是

system("ls &");

阅读一本好的 Unix 书籍。你需要了解 fork()、exec()、wait() 等等。

【讨论】:

  • 请注意,运行 system("ls &") 会将后台工作委派给 /bin/sh,但无法进行进一步的作业控制。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2018-05-08
  • 1970-01-01
  • 2022-06-18
相关资源
最近更新 更多