【问题标题】:Invalid time interval & in my basic shell that I am creating在我正在创建的基本 shell 中,时间间隔无效
【发布时间】: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 是一种分析、扩展和解释命令行以及合成命令调用的语言。

标签: c shell


【解决方案1】:
char *idx = strrchr(cmd, '&');
if(idx != NULL)
    *idx = '\0';

在字符串中找到最后一个&,并将其替换为'0'(字符串结尾)

【讨论】:

  • oops - 太多的 c++ 编程 tx
  • 我明白这是做什么的,但不知道在哪里写。我将 args[0], args 传递给 execvp。有没有办法从 args 本身中删除 '&'。
  • 你不应该修改参数。复制(使用 strcpy)你想要更改的字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多