gpt4 book ai didi

c - 重定向 execvp 的输入/输出

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:17 25 4
gpt4 key购买 nike

我想在程序遇到“>”时将输出重定向到特定文件,并在找到“<”时从文件获取输入。

这适用于输入,但当我尝试将输出写入文件时,它不会在实际文件中写入任何内容,也不会在终端中显示。

我似乎无法弄清楚为什么,有人可以帮忙吗?

switch(fork()){
case 0:

for(i=0; i<num; i++){

if(strcmp(argv[i], ">") == 0){
if(fd1 = open(argv[i+1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR) < 0){
perror("cant open file");
exit(0);
}
dup2(fd1, 1);
close(fd1);
argv[i] = NULL;
}

if(strcmp(argv[i], "<") == 0){
if(fd0 = open(argv[i+1], O_RDONLY) < 0){
perror("cant open file");
exit(0);
}
dup2(fd0, 0);
close(fd0);
}

}

execvp(argv[0], argv);

最佳答案

主要问题是 =运算符的优先级低于 <运算符(operator)。因此,在你的表达中

fd1 = open(argv[i+1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR) < 0

open()的返回值与 0 进行比较,然后比较的结果——1 或 0——分配给 fd1 .新打开的文件描述符丢失,不再使用。比较的实际结果很可能是 0(文件已成功打开),因此您的 dup2()稍后调用几行尝试将文件描述符 0 复制到文件描述符 1 上。这很可能有效,但您执行的程序写入该文件描述符的任何尝试很可能会失败。

你应该这样写

(fd1 = open(argv[i+1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0

或者,不那么聪明,将其分成两个语句,这样一开始就不会出现优先级问题。

当你重定向输入时你有同样的问题,所以我怀疑你声称“这适用于输入”,但是因为在那种情况下你最终只会将文件描述符 0 复制到它自己上,问题将简单地表现为重定向未按预期工作——输入仍将来自原始程序的标准输入,而不是您指定的标准输入。

但是,如果您允许 shell 执行输入重定向而不是引用重定向运算符以便将其作为参数传递给程序,那么即使这样也可能不会引起注意。

关于c - 重定向 execvp 的输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46648120/

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