在 C 中重定向 stderr

Redirecting stderr in C

我正在用 C 编写一个简单的 shell,遇到了一个小问题。 我有以下功能:

int execStdErr(char** parsedArguments, int numberOfArgs) {
  fflush(stderr);
  int fd;
  int parsedCommandLength = 0;
  char** parsedCommand = parseLine(parsedArguments[0], &parsedCommandLength);
  parsedArguments[numberOfArgs - 1] = deleteSpaces(parsedArguments[numberOfArgs - 1]);
  if (fork() == 0) {
    if (fd = open(parsedArguments[numberOfArgs - 1], O_WRONLY | O_CREAT |O_TRUNC,  S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) {
      perror("lsh");
      return 1;
    }
    if (dup2(fd, 2) < 0) {
     perror("lsh") ;
     return 1;
    }
    close(fd);
    execvp(parsedCommand[0], parsedCommand);
    exit(0);
  }
  close(fd);
  wait(NULL);
  return 0;
}

parsedArguments 是由 2> 拆分的参数,然后我将最后一个参数作为我的文件名,然后我通过按空格拆分它们来处理前一个参数(它们在 parsedCommand).出于某种原因 stderr 打印在屏幕上,如果它不存在,它会创建一个文件,但它总是空的。我不知道这里可能是什么问题。

常见错误:

if (fd = open(...) < 0) 

相当于

 if (fd = (open(...) < 0)) 

这不是你想要的。您需要:

 if ( (fd = open(...)) < 0) 

open 成功时,open(...) < 0 求值为 false,并且 fd = open(...) < 00 分配给 fd。然而,open 返回的值丢失了。