close(2)
Name
close − delete a descriptor
Syntax
close(fd)
int fd;
Description
The close call deletes a descriptor from the per-process object reference table. If the descriptor is the last reference to the underlying object, then the object is deactivated. For example, on the last close of a file, the current seek pointer associated with the file is lost. On the last close of a socket, close discards associated naming information and queued data. On the last close of a file holding an advisory lock, the lock is released. For further information, see flock(.).
A process’s descriptors are automatically closed when a process exits, but because each process can have a limited number of active descriptors, close is necessary for programs that deal with many descriptors.
When a process forks, all descriptors for the new child process reference the same objects as they did in the parent process before the fork. For further information, see fork(.). If a new process is then to be run using execve, the process would normally inherit these descriptors. Most of the descriptors can be rearranged with the dup2 system call or deleted with close before execve is called. However, if any descriptors are needed if the execve fails, they must be closed if the execve succeeds. For this reason, the call, fcntl(d, F_SETFD, 1), is provided. This call arranges that a descriptor is closed after a successful execve call. The call, fcntl(d, F_SETFD, 0), restores the default, which is to not close the descriptor.
When close is used on a descriptor that refers to a remote file over NFS, and that file has been modified by using write(,), then any cached write data is flushed before close returns. If an asynchronous write error has occurred previously with this remote file, or occurred as part of the flush operation described above, then close returns −1 and errno will be set to the error code. The return code from close() should be inspected by any program that can write over NFS.
Return Values
Upon successful completion, a value of 0 is returned. Otherwise, a value of −1 is returned, and the global integer variable, errno, is set to indicate the error.
Diagnostics
The close system call fails under the following conditions:
[EBADF] D is not an active descriptor.
[EINTR] The close function was interrupted by a signal.
If an error occurs on an asynchronous write over NFS, the error cannot always be returned from a write system call. The error code is returned on close or fsync. The following are NFS-only error messages:
[EACCESS] The requested address is protected, and the current user has inadequate permission to access it.
[ENOSPC] There is no free space remaining on the file system containing the file.
[EDQUOT] The user’s quota of disk blocks on the file system containing the file has been exhausted.
[EIO] An I/O error occurred while reading from or writing to the file system.
[EROFS] The file is on a read-only file system.
[ESTALE] The fd argument is invalid because the file referred to by that file handle no longer exists or has been revoked.
[ETIMEDOUT] A write operation failed because the server did not properly respond after a period of time that is dependent on the mount() options.
See Also
accept(2), execve(2), fcntl(2), flock(2), fsync(2), open(2), pipe(2), socket(2), socketpair(2), write(2)