2016-03-02 38 views
1

所以我正在创建一个基本的shell。我fork并调用execvp。如果一个命令(即sleep 5m &)最后有“&”,我的父进程不会等待子进程。否则它。所以在孩子的过程中,我打电话给execvp(args[0],args)。如果参数为sleep 5m &,如何删除&,以便子进程只读取而不是&,因为我猜测问题来自哪里。无效的时间间隔&在我创建的基本shell中

if(pid==0){ 
    execvp(args[0],args); 
} 
//if parent process 
if(!(strcmp(args[0],"&")==0)){ 
    wait(0); 
} 

编辑:我是能够通过使用标志来解决它,如果用户输入包括&,我打开标志。现在,它的工作原理

+1

只是描述散文的代码几乎是永远不够清晰(散文,不像代码,可以替换它以多种方式解释)。请显示代码的[最小完整且可验证的示例](https://stackoverflow.com/help/mcve),以说明问题。 – kaylum

+0

你写的代码是什么?请至少张贴您面临问题的代码片段。这样,我们可以帮助你更好 –

+0

简单的搜索是一个非常糟糕的主意。如果'&'被转义或字符串文字会怎么样?您需要正确解析输入。语句的实际执行在设计解释器(shell是)方面的工作较少。 – Olaf

回答

0
char *idx = strrchr(cmd, '&'); 
if(idx != NULL) 
    *idx = '\0'; 

找到字符串中的最后&和“0”(字符串的结束)

+0

http://pubs.opengroup.org/onlinepubs/009695399/functions/strrchr.html – pm100

+0

oops - 太多的C++编程tx – pm100

+0

我明白这是做什么,但我不知道在哪里写它。我传递args [0],参数到execvp。有没有办法从参数本身中删除'&'。 – StephCurry3093

相关问题