close(), exceptions and problems
Marcin 'Qrczak' Kowalczyk
qrczak at knm.org.pl
Sat Mar 24 11:22:43 EST 2001
Sat, 24 Mar 2001 12:23:03 +0000 (UTC), Erwin S. Andreasen <erwin at andreasen.com> pisze:
> But if you call close(fd) you aren't supposed to do something like:
>
> int fd, rv;
> while (((rv = close(fd)) < 0 && errno == EINTR))
> ;
> if (rv < 0)
> perror("close");
Linux documentation says otherwise.
File: libc.info, Node: Opening and Closing Files, Next: I/O Primitives, Up: Low-Level I/O
[...]
- Function: int close (int FILEDES)
The function `close' closes the file descriptor FILEDES. Closing
a file has the following consequences:
* The file descriptor is deallocated.
* Any record locks owned by the process on the file are
unlocked.
* When all file descriptors associated with a pipe or FIFO have
been closed, any unread data is discarded.
This function is a cancellation point in multi-threaded programs.
This is a problem if the thread allocates some resources (like
memory, file descriptors, semaphores or whatever) at the time
`close' is called. If the thread gets cancelled these resources
stay allocated until the program ends. To avoid this, calls to
`close' should be protected using cancellation handlers.
The normal return value from `close' is 0; a value of -1 is
returned in case of failure. The following `errno' error
conditions are defined for this function:
`EBADF'
The FILEDES argument is not a valid file descriptor.
`EINTR'
The `close' call was interrupted by a signal. *Note
Interrupted Primitives::. Here is an example of how to
handle `EINTR' properly:
TEMP_FAILURE_RETRY (close (desc));
`ENOSPC'
`EIO'
`EDQUOT'
When the file is accessed by NFS, these errors from `write'
can sometimes not be detected until `close'. *Note I/O
Primitives::, for details on their meaning.
--
__("< Marcin Kowalczyk * qrczak at knm.org.pl http://qrczak.ids.net.pl/
\__/
^^ SYGNATURA ZASTĘPCZA
QRCZAK
More information about the Python-list
mailing list