CLOSE(2)

명칭
close - 기술자를 삭제한다

프로그램 라이브러리
libc

서식
<unistd.h> int close(int d)

해설
close() (은)는 프로세스의 오브젝트 참조 테이블에서 기술자를 삭제합니다. 이것이 그 오브젝트에의 마지막 참조였던 경우, 오브젝트는 액티브하지 않게 됩니다. 예를 들어, 파일에 대한 마지막 클로우즈로, 그 파일에 연결시킬 수 있었던 현재의 seek 포인터는 없어집니다. socket(2) 에 대한 마지막 클로우즈로, 그 소켓에 연결시킬 수 있었다 명명 정보와 기다리는 행렬내의 데이터는 파기됩니다. 문의형 락을 보관 유지하고 있다 파일에 대한 마지막 클로우즈로, 락은 해방됩니다 (자세한 것은 flock(2) (을)를 참조). 그러나, System V 와 p1003.1-88 그럼, 어느 프로세스가 파일에 대해서 보관 유지하고 있는 모든 fcntl(2) 문의형 레코드 락은, 그 파일에 대한 파일 기술자의 언젠가 하지만 그 프로세스에 의해 닫혀질 때 삭제된다, 라고 규정하고 있습니다.

프로세스가 종료할 때, 프로세스에 연결시킬 수 있었다 파일 기술자는 모두 해방됩니다. 그러나, 액티브한 기술자의 개수에는 프로세스 마다 제한이 있으므로, 대량의 파일 기술자를 처리할 때는, close() 함수 호출이 편리합니다.

프로세스가 포크 할 때 (fork(2) 참조), 새로운 child process의 기술자는 모두, 포크의 전에 parent process의 기술자가 참조하고 있던 것과 같은 오브젝트를 참조합니다. 다음에, 새로운 프로세스가 execve(2) 그리고 실행되는 경우, 그 프로세스는 통상 이러한 기술자를 계승합니다. 대부분의 기술자는 execve(2) 의 전에 dup2(2) 그리고 재배치되는지, close() 그리고 삭제됩니다. 만약 execve 가 실패했을 경우에 이러한 기술자가 필요하게 된다면, execve 가 성공했을 경우에게만, 그것들을 클로우즈 하도록(듯이) 할 필요가 있습니다. 이 때문에, “fcntl(d, F_SETFD, 1)” 호출이 준비되어 있습니다. 이것은 execve 가 성공한 다음에, 기술자를 닫도록(듯이) 지시합니다. “fcntl(d, F_SETFD, 0)” 호출은 이것을 디폴트에 되돌립니다. 디폴트에서는, 기술자는 클로우즈 되지 않습니다.

반환값

에러
close() (은)는 다음의 경우에 실패합니다:

[EBADF]
    d 하지만 액티브한 기술자가 아닙니다.

[EINTR]
    세치기가 수신되었습니다.

관련 항목
accept(2), execve(2), fcntl(2), flock(2), open(2), pipe(2), socket(2), socketpair(2)

표준
close() 함수는 p1003.1-90 에 준거하고 있습니다.

역사
close() 함수는 AT&T UNIX 그리고 등장했습니다.