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

时间:2015-11-14 14:36:11

标签: c linux exec

我的代码中有一些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

2 个答案:

答案 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)

假设argsargv传递给main()函数 1

您的程序调用未定义的行为

while (args[i] != NULL)
{
    printf("%s\n", args[i]);
    i++;
}

在此循环结束时,i的值超出args数组的范围。因此

args[i] = ">";
args[i + 1] = "a.log";

尝试在禁止位置写入,调用未定义的行为。

1 目前尚不清楚,因为显然缺少一些代码