Search code examples
cstderr

Redirecting stderr in C


I'm writing a simple shell in C and encountered a minor problem. I have the following function:

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 are arguments splitted by 2>, then I take the last one as it is name of my file, and I process the previous one by splitting them on spaces (and they are in parsedCommand). For some reason the stderr prints on screen, it creates a file if it didn't exist but it is always empty. I don't know what might be the problem here.


Solution

  • A common error:

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

    is equivalent to

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

    which is not what you want. You need:

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

    When open succeeds, open(...) < 0 evaluates to false and fd = open(...) < 0 assigns 0 to fd. The value returned by open, however, is lost.