【发布时间】:2016-03-02 01:07:58
【问题描述】:
所以我正在创建一个基本的外壳。我分叉并调用 execvp。如果一个命令(即sleep 5m &)最后有“&”,我的父进程不会等待子进程。否则它会。所以在子进程中,我调用execvp(args[0],args)。如果 args 是 sleep 5m &,我怎样才能删除 & 以便子进程只读取 sleep 5m 而不是 & 因为我猜这是问题的来源。
if(pid==0){
execvp(args[0],args);
}
//if parent process
if(!(strcmp(args[0],"&")==0)){
wait(0);
}
编辑:我可以通过使用标志来解决它,如果用户输入包含 &,我打开了标志。现在可以了
【问题讨论】:
-
仅仅用散文描述代码几乎永远不够清晰(散文与代码不同,可以用多种方式解释)。请显示说明问题的代码的minimal complete and verifiable example。
-
你写的代码是什么???请至少发布您遇到问题的代码的 sn-p。这样,我们可以更好地帮助您
-
简单的搜索是一个非常糟糕的主意。如果
&被转义或在字符串文字中怎么办?您需要正确解析输入。语句的实际执行是设计解释器(shell 就是)的次要工作。 -
是的;并非原始命令行中的所有语法都成为子进程的参数材料!例如,
> file变成标准输出的重定向,而不是参数">"和"file"。并非所有 确实 成为参数材料的命令行材料都是逐字逐句的。例如$VAR必须变成变量的扩展值(可能是多个参数,如果不加引号)等等。基本上,shell 是一种分析、扩展和解释命令行以及合成命令调用的语言。