我想检查用户是否输入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());
}
请告诉我解决此问题的适当方法是什么?
答案 0 :(得分:4)
为了可靠地执行此操作,您需要以与shell相同的方式正确解析命令。通常你为它定义一个语法并使用解析器生成器。其他一切都只是猜测,很可能会失败。
例如,考虑一下:
some_program \&&
它以两个&符号(&&
)结束,但无论如何它都是后台进程,因为第一个&符号被转义(\&
)。
但是,将后缀\&&
标记为“背景”也不正确,因为
some_program \\&&
不是后台进程(而是一个不完整的命令)。
只要你没有定义一个正确的语法,很可能你不能正确地捕捉到我的两个例子可能显示的所有内容。
另一类问题可能是从终端分离的程序(有时称为守护程序)。它们不是由壳体背景,它们自己也这样做。