shell 소스중 redirection 구현 부분인데...

nan392의 이미지

int redirect_in(char ** myArgv) {
  int i;
  int fd;

  /* search forward for < */
  for (i = 0; myArgv[i] != NULL; i++) {
    if (!strcmp(myArgv[i], "<")) {
      break;
    }
  }

  if (myArgv[i]) {      /* found "<" in vector. */

    if (!myArgv[i+1]) { /* File for redirection has not been provided*/
      errno = EINVAL;
      return -1;

    } else {            /* Open file. */
      if ((fd =open(myArgv[i+1],O_RDONLY)) == -1) {
        perror(myArgv[i+1]);
        return -1;
      }
    }

    dup2(fd,STDIN_FILENO);      /* Redirect to use it for input. */
    close(fd);

    for (i = i + 2; myArgv[i] != NULL; i++) { /* close up the vector */
      myArgv[i-2] = myArgv[i];
    }
    myArgv[i-2] = NULL;      /* NULL pointer at end */
  }
  return 0;
}

위의 코드 중에서 dup2를 사용해서 File descriptor를 변경해주는 것까진
이해가 되는데, 그후 나오는 for문의 의미를 잘 모르겠습니다.(/*close up the vector */라는 주석이 있는데도 불구하고.. :cry: )

ls -al > a.txt 라는 argument를 처리 할때 등의 예를 들어서
설명해주시면 감사하겠습니다.

sliver의 이미지

myArgv가 aaa < bbb.txt -a -b 이렇다면

맨 밑의 for loop는 aaa -a -b로 바꿔주는것 같네요

nan392의 이미지

아 옵션을 리다이렉션 뒤에 붙이는 경우두 있군요~
역시 무식하면 고생한다더니 ㅜ.ㅜ
답변해주셔서 감사합니다.
좋은 주말 되세요