fork 시 file에 오픈여부
글쓴이: BarracuTa / 작성시간: 수, 2005/07/13 - 2:19오전
자식 프로세스가 fork로 상속받은 화일 기술자를 닫아 버렸을때
부모 프로세스에서는 어떤 상황이 발생하는지에 대한 테스트입니다.
부모프로세스에서 화일이 개방된 상태로 남아 있을까하는 부분인데
아래결과에서 모드가 O_RDWR로 나온것도 이상하고
생성된 화일에 퍼미션에 S도 아리송합니다.
제생각에는 결과에는 스위치문에 no such mode 가출력되고
close도 이미 닫힌 기술자이기때문에 오류발생이 나야한다고 생각이들거든요...
왜 그런건가요?
질문 읽어주셔서 감사합니다.
#include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/wait.h> int main() { pid_t pid; int fd; int arg; if((fd=open("test2",O_CREAT|O_RDWR))==-1) { perror("open"); exit(1); } if((pid=fork())<0) { perror("fork"); exit(1); } else if(pid==0)//자식 { printf("child close fd%d\n",fd); close(fd);//파일을 닫는다. sleep(5); } else { wait((int*)0); printf("im parent %d\n",fd); arg=fcntl(fd,F_GETFL); switch(arg&O_ACCMODE) { case O_RDWR:printf("rdwr\n");break; case O_WRONLY:print("wronly\n");break; case O_RDONLY:printf("rdonly\n");break; default:printf("no such mode\n"); } if(close(fd)==-1) { perror("close"); exit(1); } } exit(0); }
결과창
child close fd3 im parent 3 rdw
생성된 파일에 퍼미션입니다...
---Srwx--- 1 barracuTa barracuTa 0 7월 13 01:28test2
rm 하고 제 실행하니 퍼미션이 이번엔 아래와 같습니다. --w--ws--- 1 barracuTa barracuTa 0 7월 13 02:35 test2
Forums:
퍼미션 문제는 open 함수에 파일 퍼미션 값을 넘겨주지 않아서 쓰래기
퍼미션 문제는 open 함수에 파일 퍼미션 값을 넘겨주지 않아서 쓰래기 값으로 퍼미션이 셋팅되서 그런듯 하네요.
그리고 fork 하면 자식에서 닫아도 부모는 열려있는게 맞습니다.
반대로 부모가 닫아도 자식은 열려있습니다.
하지만 소켓의 경우는 2가지가 있습니다.
그냥 close 함수를 통해 닫을 때는 위에 말한 것 처럼 작동하지만
shutdown 으로 닫게 되면 부모와 자식 모두 닫히게 됩니다.
(내부적으로 좀 더 복잡한 이유가 있지만 결과적으로 이렇게 됩니다.)
댓글 달기