如何检查子字符串的实例是否在字符串的末尾并且只是一次(例如使用strstr)?

时间:2013-09-29 00:16:57

标签: c linux string shell strstr

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

  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());
              }

请告诉我解决此问题的适当方法是什么?

1 个答案:

答案 0 :(得分:4)

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

例如,考虑一下:

some_program \&&

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

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

some_program \\&&

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

只要你没有定义一个正确的语法,很可能你不能正确地捕捉到我的两个例子可能显示的所有内容。

另一类问题可能是从终端分离的程序(有时称为守护程序)。它们不是由壳体背景,它们自己也这样做。