리눅스 fork()에 대해서 갑자기 궁굼한 점이 생겨서 질문을 올립니다.
글쓴이: jongyoungcha / 작성시간: 토, 2012/12/01 - 11:33오후
만약에 리눅스에서 fork()를 하지 않습까?
pid_t pid = fork();
를 하면 pid 에는 0이 저장되서
if(pid == 0){
자식구간
}else if(pid == -1){
포크실패
}else{
부모공간
}
예 pid가 0이되는데
사실 제가 알기로는 프로세스당 파일디스크립터의 0, 1, 2인덱스는 stdin, stdout, stderr로 할당되는 걸로 알고 있습니다.
그래서 파일디스크립터 인덱스를 할당 받을때는 3부터 받는다......
그리고 fork를 하면 부모의 파일디스크립터의 인덱스를 복사되서
자식프로세스에게 전달되는 걸로 알고있습니다.
그러면 fork 시에 저장되는 자식의 pid 0의 값은 공간은 파일디스크립터에 저장되지 않는다는 것을 뜻합니까?
갑자기 너무 궁굼해져서 이렇게 질문을 올리게 되네요
Forums:
pid는 process id 입니다.
fork의 결과로 반환되는 process id는 file descriptor와 관계가 없습니다.
그러면 어떤 값이 들어오는 걸까요 ㅠㅠ
그러면 어떤 값이 들어오는 걸까요 ㅠㅠ
UNIX programming 관련 서적을 찾아보시면 쉽게 알 수 있을겁니다.
fork는 현재 프로세스를 복사해서 두개의 프로세스로 나누는 함수입니다.
fork의 반환값은 프로세스 id인데 원본(부모) 프로세스의 경우 자식의 프로세스 id를 반환하고 자식 프로세스일 경우 0을 반환하여 자식 프로세스임을 나타내는 것입니다. (프로세스 id 0은 유효한 프로세스 id 값이 아니지만 fork 함수의 특성상 자식임을 나타내기 위한 방법으로 사용한 것입니다)
fork는 프로세스를 그대로 복제하는 것이므로 모든 handle 값은 그대로 복사됩니다. file descriptor도 예외는 아닙니다.
'fork 시에 저장되는 자식의 pid 0의 값은 공간은 파일디스크립터에 저장되지 않는다'라는 말을 언급하신 걸로 봐서 아무래도 프로그래밍 초보이신 듯 한데요. (언급하신 내용은 일상 생활에서 쓰는 언어로 표현하면 '짜장면에 짜장면 집 주소를 넣지 않는다'라는 말과 비슷하다고 보면 됩니다. 즉, 말은 말인데 이상한 말입니다.)
Windows든 UNIX 든 관계 없이 프로그래밍 서적을 찾아서 프로세스, 쓰레드, 핸들에 대한 개념을 명확히 정립하시는 것이 우선일 듯 합니다.
감사합니다 ^^
감사합니다 ^^
댓글 달기