gpt4 book ai didi

c - 重定向后没有这样的文件或目录 - 简单的命令行程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:36 27 4
gpt4 key购买 nike

我正在编写一个 shell。这是处理重定向的一小部分。我只包含了导致错误的片段。该程序的这一部分应该采用命令/参数行并相应地执行该行。 wc < junk > junk2 是命令行输入的示例,出于某种原因,当我执行该行时会产生错误 junk: >: open: No such file or directory。程序的其余部分运行良好,但在这里中断了。

: wc < junk > junk2

junk: >: open: No such file or directory

1 4 31 junk2
1 4 31 total

我曾短暂地让它按预期工作,但出于某种原因,我一定是丢失了一 block 拼图,因为它又一次坏了。

我查看了我的数组值,它们符合预期。需要说明的是,我使用的是参数数组的副本,因此通过将参数副本值设置为 NULL,原始数组不会发生变化。我将参数副本值设置为 null,因此循环不会重复使用重定向。

如果您有任何建议或看到我显然无法解决的问题,我们将不胜感激。

    while (arguments[i] != NULL)
{


if ((strcmp(argumentsCopy[i], "<") == 0))
{
if ((access(argumentsCopy[i + 1], R_OK) == -1))
{
printf("Cannot open %s for input\n", argumentsCopy[i + 1]);
fflush(stdout);
redirect = 1;
}
else
{

int fd = open(argumentsCopy[i + 1], O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);
argumentsCopy[i] = NULL;
redirect = 1;
execvp(command, &arguments[i + 1]);
}

}
if ((strcmp(argumentsCopy[i], ">") == 0))
{


int fd = open(argumentsCopy[ i + 1], O_RDWR);
dup2(fd, STDOUT_FILENO);
close(fd);
argumentsCopy[i] = NULL;
redirect = 1; // avoid repeat use of redirection symbol in arguments array
execvp(command, &arguments[i + 1]);
}

i++;
}
if (redirect == 0)
{

execvp(command, execArgs); //execArgs is entire command w/ arguments
}
exit 0; //default if error occurred.

最佳答案

首先,请注意您没有正确使用 execvp功能。一旦调用 execvp (或 exec 系列中的任何调用)成功,当前程序的执行终止并被您所在的程序取代 exec荷兰国际集团因此,控制流永远不应超过 execvp。调用,除非该调用失败。因此,您不能调用 execvp直到你确定stdinstdout文件描述符已正确重定向(在您同时具有输入和输出重定向的情况下)。从您的代码示例中,您似乎调用了 execvp一旦检测到任何一个,这意味着您的 shell 只能重定向输入 输出,而不能同时重定向。

但是,这不是您收到的错误的来源。考虑输入 wc < junk > junk2 .根据您提供的信息,命令和参数数组将填充如下:

command = "wc"
arguments[0] = ">"
arguments[1] = "junk"
arguments[2] = "<"
arguments[3] = "junk2"
arguments[4] = NULL

i = 0 , 第一个 if 语句将被执行,打开文件描述符并执行 execvp使用参数 command&arguments[i+1] .这些对应于要执行的文件和 argv分别传递给该函数的 main 方法的数组。在这种情况下,命令是 wc参数是 { "junk", "<", "junk2", NULL } (因为这是从 &arguments[i+1] 开始的空终止数组的值)。在 Unix 系统上,第一个参数 ( argv[0] ) 通常是当前程序的名称。因此实际的命令行参数开始于 argv[1] (有关文档,请参阅 Program Arguments)。来自 wc的角度来看,它应该处理的命令行参数是 { "<", "junk2", NULL }在它处理它认为是它的程序名称之后,argv[0] , 或 junk .

wc将要处理的文件列表作为参数。在这种情况下,它认为该列表是 <junk2 , 作为 "<"是 bash 和其他 shell 识别的运算符,而不是执行程序。因此,wc (认为​​它的名字是 junk 因为 argv[0] )试图打开 <作为输入文件失败,打印消息:

junk: >: open: No such file or directory

关于c - 重定向后没有这样的文件或目录 - 简单的命令行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45538027/

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