1

我想检查用户是否正在输入类似的内容ls&ls &以便我能够bg_flag在 shell 中设置后台作业。但是以下代码无法检查ls&&. 因为我不希望它被视为后台作业(我不确定它在 Linux shell 中是否相同)如果用户输入ls&&或最后有多个&

  if (strstr(args[arg_count-1],"&")!=NULL)
  //if (strcmp(args[arg_count-1],"&")==0)
              {
                bg_flag=1;
                printf("I am a background job %d ",getpid());
              }

请让我知道解决此问题的适当方法是什么?

4

1 回答 1

4

为了可靠地做到这一点,您需要以与 shell 相同的方式正确解析命令。通常,您为此定义语法并使用解析器生成器。其他一切都只是猜测,很可能会失败。

例如,考虑一下:

some_program \&&

它以两个 & 符号 ( &&) 结尾,但无论如何这将是一个后台进程,因为第一个 & 符号被转义 ( \&)。

但是,将后缀标记\&&为“背景”也不正确,因为

some_program \\&&

不会是后台进程(而是一个不完整的命令)。

而且,只要您没有定义正确的语法,就很可能无法正确掌握所有内容,正如我的两个示例所示。

另一种问题可能是程序与终端分离(有时称为守护进程)。它们不受外壳的影响,它们自己做同样的事情。

于 2013-09-29T00:27:47.053 回答