首页 > 解决方案 > 在 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,屏幕上的打印,如果它不存在,它会创建一个文件,但它总是空的。我不知道这里可能是什么问题。

标签: cstderr

解决方案


一个常见错误:

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

相当于

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

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

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

open成功时,open(...) < 0评估为 false 并fd = open(...) < 0分配0fdopen但是,返回的值会丢失。


推荐阅读