example', 'cat example > samp-6ren">
gpt4 book ai didi

c - 重定向错误仅发生在 "ls"命令上。其他命令重定向得很好。我的代码有什么问题吗?

转载 作者:行者123 更新时间:2023-11-30 17:29:53 24 4
gpt4 key购买 nike

我正在做一个小型学校项目,制作我自己的 bash shell。它必须包括简单的重定向功能。

我几乎成功了...以下命令运行良好 'pwd > example', 'cat example > sample1', 'echo Sent > Sample2'

但是,“ls > example”命令出现故障!每当我这样做时,它都会创建一个新文件,但它是空的。如果“sample”文件已存在且不为空,则“ls > example”命令会使该文件为空。

只需一个“ls”命令本身就可以很好地工作,显示所有文件和目录名称,即使它们没有按字母顺序排序。

我找不到我的代码有问题..请有人帮助我。

下面是重定向部分

int bak, new;
int redirLoca; // indicates ">" location in argv[].

else if (boolRedirect == 1) {
redirLoca = checkRedirLoca(argc, argv);
fflush(stdout);
bak = dup(1);
new = open(argv[redirLoca + 1], O_WRONLY | O_CREAT | O_TRUNC, 0777);
dup2(new, 1);
close(new);
executeCmd(argc, argv, boolCorrect, cmdNum, boolRedirect); // 'ls' command executed here.
fflush(stdout);
dup2(bak, 1);
close(bak);
}

这是“ls”命令的实现。

int list_ls(int argc, char **argv)
{

DIR *dirP;
struct dirent *direntP;

if (argc == 1) {
dirP = opendir(".");

while ((direntP = readdir(dirP)) != NULL) {
printf("%s\n", direntP -> d_name);
}

closedir(dirP);
} else if (argc == 2) {
dirP = opendir(argv[1]);

while ((direntP = readdir(dirP)) != NULL) {
printf("%s\n", direntP -> d_name);
}

closedir(dirP);
}

return 0;
}

谢谢。

最佳答案

man dup2 说:

“dup2()系统调用执行与dup()相同的任务,但它不使用编号最小的未使用文件描述符,而是使用newfd中指定的描述符编号。如果描述符newfd先前已打开,则它是在重新使用之前默默关闭。”

您将打开的参数文件代替标准输出并关闭标准输出。这使得标准输出输出始终为零长度,创建零长度重定向文件。

补充:您可以尝试使用 strace 调试问题,以查看您的应用程序正在执行哪些系统级操作。然后,您可以检查每个调用的手册页,以了解它使用给定参数执行的操作。

关于c - 重定向错误仅发生在 "ls"命令上。其他命令重定向得很好。我的代码有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25466613/

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