a.log"这应该将结果带到输出,它没有响应并出错! int lsh_launch(c-6ren">
gpt4 book ai didi

c - execvp() 不处理写入输出 >filename.log

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:14 24 4
gpt4 key购买 nike

我的代码中的 execvp 有一些问题,我想写一个简单的终端,将命令的结果保存在日志文件中,问题是当我使用 "> a.log"这应该将结果带到输出,它没有响应并出错!

int lsh_launch(char **args)
{
pid_t pid;
int status;
int i = 0;
while (args[i] != NULL)
{
printf("%s\n", args[i]);
i++;
}
args[i] = ">";
args[i + 1] = "a.log";
pid = fork();
if (pid == 0)
{
printf("child proc\n");
// Child process
if (execvp(args[0], args) == -1)
{
perror("lsh");
}
if (execvp(args[0], args) == -1)
{
perror("lsh");
}
exit(EXIT_FAILURE);
}
else if (pid < 0)
{
// Error forking
perror("lsh");
}
else
{
// Parent process
do {
waitpid(pid, &status, WUNTRACED);
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
}
return 1;
}

当我将 args 更改为其他值(例如 -v 以查看版本)时,它起作用了,而且问题似乎出在导出到输出上!当我对程序执行 ls> a.log 时的结果是:

-  ls: cannot access >: No such file or directory
- ls: cannot access a.log: No such file or directory

最佳答案

重定向不是通过这种方式获得的。 > (或类似的)是在 shell 中进行重定向的语法。 shell 解释命令行并在执行命令之前进行重定向,这样:

pid = fork();
switch(pid) {
case 0:
d = open("myfile",O_WRONLY);
dup2(d,STDOUT_FILENO); // redirect *stdout* to open file d by duplicating it
close(d); // now unused d (d is a duplicate of *stdout*
exec**(...); // now mutate to a new code which inherits open file descriptors
exit(1);
break;
case -1: // error case of fork
break;
default:
wait(NULL); // or whatever you want, don't wait for *background style*
break;
}

关于c - execvp() 不处理写入输出 >filename.log,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709533/

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