| Skip Navigation Links | |
| Exit Print View | |
![]() | man pages section 2: System Calls Oracle Solaris 11 Information Library |
- close a file descriptor
#include <unistd.h>intclose(intfildes);
Theclose() function deallocates the file descriptor indicated byfildes. To deallocatemeans to make the file descriptor available for return by subsequent callstoopen(2) or other functions that allocate file descriptors. All outstanding recordlocks owned by the process on the file associated with the filedescriptor will be removed (that is, unlocked).
Ifclose() is interrupted by a signal that is to be caught,it will return-1 witherrno set toEINTR and the stateoffildes is unspecified. If an I/O error occurred while reading fromor writing to the file system duringclose(), it returns -1, setserrnotoEIO, and the state offildes is unspecified.
When all file descriptors associated with a pipe or FIFO special fileare closed, any data remaining in the pipe or FIFO will bediscarded.
When all file descriptors associated with an open file description have beenclosed the open file description will be freed.
If the link count of the file is 0, when all filedescriptors associated with the file are closed, the space occupied by thefile will be freed and the file will no longer be accessible.
If a streams-based (seeIntro(2))fildes is closed and the calling processwas previously registered to receive aSIGPOLL signal (seesignal(3C)) for events associatedwith that stream (seeI_SETSIG instreamio(7I)), the calling process will beunregistered for events associated with the stream. The lastclose() fora stream causes the stream associated withfildes to be dismantled. IfO_NONBLOCK andO_NDELAY are not set and there have been no signalsposted for the stream, and if there is data on the module'swrite queue,close() waits up to 15 seconds (for each module and driver)for any output to drain before dismantling the stream. The time delaycan be changed via anI_SETCLTIMEioctl(2) request (seestreamio(7I)). If theO_NONBLOCKorO_NDELAY flag is set, or if there are any pending signals,close()does not wait for output to drain, and dismantles the stream immediately.
Iffildes is associated with one end of a pipe, the lastclose() causes a hangup to occur on the other end of thepipe. In addition, if the other end of the pipe hasbeen named byfattach(3C), then the lastclose() forces the named endto be detached byfdetach(3C). If the named end has no open filedescriptors associated with it and gets detached, the stream associated with thatend is also dismantled.
Iffildes refers to the master side of a pseudo-terminal, aSIGHUPsignal is sent to the session leader, if any, for which theslave side of the pseudo-terminal is the controlling terminal. It is unspecifiedwhether closing the master side of the pseudo-terminal flushes all queued input andoutput.
Iffildes refers to the slave side of a streams-based pseudo-terminal, azero-length message may be sent to the master.
When there is an outstanding cancelable asynchronous I/O operation againstfildes whenclose() is called, that I/O operation is canceled. An I/O operation thatis not canceled completes as if theclose() operation had not yetoccurred. All operations that are not canceled will complete as if theclose()blocked until the operations completed.
If a shared memory object or a memory mapped file remains referencedat the last close (that is, a process has it mapped), thenthe entire contents of the memory object will persist until the memoryobject becomes unreferenced. If this is the last close of a sharedmemory object or a memory mapped file and the close results in thememory object becoming unreferenced, and the memory object has been unlinked, thenthe memory object will be removed.
Iffildes refers to a socket,close() causes the socket to bedestroyed. If the socket is connection-mode, and theSO_LINGER option isset for the socket with non-zero linger time, and the socket hasuntransmitted data, thenclose() will block for up to the current linger intervaluntil all data is transmitted.
Upon successful completion,0 is returned. Otherwise,-1 is returned anderrnois set to indicate the error.
Theclose() function will fail if:
Thefildes argument is not a valid file descriptor.
Theclose() function was interrupted by a signal.
Thefildes argument is on a remote machine and the link to that machine is no longer active.
There was no free space remaining on the device containing the file.
Theclose() function may fail if:
An I/O error occurred while reading from or writing to the file system.
Example 1 Reassign a file descriptor.
The following example closes the file descriptor associated with standard output forthe current process, re-assigns standard output to a new file descriptor, andcloses the original file descriptor to clean up. This example assumes thatthe file descriptor 0, which is the descriptor for standard input, is notclosed.
#include <unistd.h>...int pfd;...close(1);dup(pfd);close(pfd);...
Incidentally, this is exactly what could be achieved using:
dup2(pfd, 1);close(pfd);
Example 2 Close a file descriptor.
In the following example,close() is used to close a file descriptorafter an unsuccessful attempt is made to associate that file descriptor witha stream.
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#define LOCKFILE "/etc/ptmp"...int pfd;FILE *fpfd;...if ((fpfd = fdopen (pfd, "w")) == NULL) { close(pfd); unlink(LOCKFILE); exit(1);}...An application that used thestdio functionfopen(3C) to open a fileshould use the correspondingfclose(3C) function rather thanclose().
Seeattributes(5) for descriptions of the following attributes:
|
Intro(2),creat(2),dup(2),exec(2),fcntl(2),ioctl(2),open(2)pipe(2),fattach(3C),fclose(3C),fdetach(3C),fopen(3C),signal(3C),signal.h(3HEAD),attributes(5),standards(5),streamio(7I)
Copyright © 2011, Oracle and/or its affiliates. All rights reserved.Legal Notices | ![]() ![]() |