我的代码中有一些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
答案 0 :(得分:3)
没有以这种方式获得重定向。 >
(或类似)是在shell中进行重定向的语法。 shell解释命令行并在exec
命令之前进行重定向,这样:
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;
}
答案 1 :(得分:0)
假设args
是argv
传递给main()
函数 1 :
您的程序调用未定义的行为
while (args[i] != NULL)
{
printf("%s\n", args[i]);
i++;
}
在此循环结束时,i
的值超出args
数组的范围。因此
args[i] = ">";
args[i + 1] = "a.log";
尝试在禁止位置写入,调用未定义的行为。
1 目前尚不清楚,因为显然缺少一些代码