gpt4 book ai didi

c - 为 shell 程序标记 char*

转载 作者:行者123 更新时间:2023-11-30 15:31:37 24 4
gpt4 key购买 nike

我正在制作一个支持用户参数和 io 重定向的 shell 程序。我在 io 重定向方面遇到问题,例如:

$cat < hello > world

首先我将参数保存在 char* 中大批。我检查第一个字符是否为 <>如果是的话,我需要去掉第一个字符并创建一个文件描述符。

这就是我正在做的事情。

    char* args[50];//<-- cat <hello and >world are in here
char* fd[2];
int fdin, fdout;
if(args[j][0] == '<'){
close(fdout);
strncpy(fd[0], args[j][1]. strlen(args[j])-1);
fdin = open(fd[0], O_RDONLY);
}

最佳答案

为了简化您的工作,请开始用某种正式语言起草您的输入内容,例如:

line : ID+ ( '<' ID | '>' '>'? ID )* ( '|' line )* '\0'

其中 ID 是一系列字符,其中每个 isAlphaisDigitisSpecial 由其他字符(例如空格、制表符、'> '、'<'、'|' 等。

在解析过程中,将第一部分(ID+)添加到链接列表中,然后将该列表转换为 argv-argc 对会更容易。

其余的进行特殊处理(不在链表中,因为它们不那么通用):

  • 使用“<”、“>”和“>>”进行 IO 重定向;那么
  • 使用“|”进行流水线操作。

由于该语言是递归的(请注意 ( '|' line )*),您的解析器也可以轻松地使用递归函数(看到了吗?您有一个函数 parse 当它到达“|”时,它会调用自身来解析其余部分)。

注意:虽然我用 BNF 表示法表示行语法,但这并不意味着您应该使用语言解析库或编译器(我想到的是 yacc)。这种语言太简单且易于实现,值得这些工具带来的所有麻烦。

关于c - 为 shell 程序标记 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24644049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com