jun-wiki

View My GitHub Profile

Posts (Latest 10 updated) :
Read all
Contents:
  1. 파일 디스크립터 확장
    1. stdin/stdout
    2. dup2 시스템 콜 구현
      1. 동작 규칙
      2. 포크와의 상호작용
  2. 예상 흐름

우울에서 뇌에 납 보충해주고 싶었는데

프로젝트 패스하니까 우울증 치료됐다

이제 다음 과제인

파일 디스크립터 확장만 하면

프로젝트 2 클리어다

바로 가보자

ദ്ദി(。•̀ ᗜ<)


파일 디스크립터 확장

stdin, stdout을 닫을 수 있으며 dup2 시스템 콜을 구현해야 한다

stdin/stdout

현재에는 기본적으로 stdin(0), stdout(1)을 안닫는다

나도 exit시 0,1은 스킵하고 2부터 닫도록 구현해놓았다

그치만 이번 과제에선 둘 다 닫기 허용해야 한다

  • close(0) 후에는 입력이 더 이상 읽히면 안 됨

  • close(1) 후에는 어떤 출력도 나가면 안 됨


dup2 시스템 콜 구현

int dup2(int oldfd, int newfd);

dup2()oldfd의 복사본을 지정된 번호 newfd로 만든다

성공 시 newfd 반환

newfd가 열려 있을 경우 슬쩍 닫은 뒤 재사용

동작 규칙

  • oldfd가 유효하지 않을 경우
    • 호출은 실패 -1 반환, newfd는 닫지 않음
  • oldfd가 유효하고 newfd==oldfd 인 경우
    • newfd 반환
  • 성공 후 의미
    • fd번호는 다르지만 같은 파일 참조해서 파일 오프셋과 상태 플래그 공유

포크와의 상호작용

dup2로 만든 FD들은 fork 하고 나서도 잘 작동해야 한다



예상 흐름

stdin/stdout은 별 거 없고

간단한 매크로 같은 걸로 처리하면 될 거 같다

define STDIN_FD ... 이런거 말이다

그리고 fd가 stdin/stdout인지 아닌지에 따라 -1 반환하는 조건도 넣어주고

해서 통과했다고 하던데 될지는 모르겠다

그리고

dup2가 어렵다고 한다…
_〆(。。)

fd를 하나 더 만들고 같은 파일 참조하게 하는 건데

둘 중 하나가 close하더라도 다른쪽은 볼 수 있어야 한다

이게 첫번째 포인트고 두 번째 포인터는…

fork해도 fork한 fd테이블의 애들이 똑같은 파일을 참조하며 dup한애도 똑같이 참조해야 한다는 거다

으음…

일단 트라이 박아봐야겠다