|  | .TH OPEN 3 | 
|  | .SH NAME | 
|  | open, create, close \- open a file for reading or writing, create file | 
|  | .SH SYNOPSIS | 
|  | .B #include <u.h> | 
|  | .br | 
|  | .B #include <libc.h> | 
|  | .PP | 
|  | .B | 
|  | int open(char *file, int omode) | 
|  | .PP | 
|  | .B | 
|  | int create(char *file, int omode, ulong perm) | 
|  | .PP | 
|  | .B | 
|  | int close(int fd) | 
|  | .SH DESCRIPTION | 
|  | .I Open | 
|  | opens the | 
|  | .I file | 
|  | for I/O and returns an associated file descriptor. | 
|  | .I Omode | 
|  | is one of | 
|  | .BR OREAD , | 
|  | .BR OWRITE , | 
|  | .BR ORDWR , | 
|  | or | 
|  | .BR OEXEC , | 
|  | asking for permission to read, write, read and write, or execute, respectively. | 
|  | In addition, there are three values that can be ORed with the | 
|  | .IR omode : | 
|  | .B OTRUNC | 
|  | says to truncate the file | 
|  | to zero length before opening it; | 
|  | .B OCEXEC | 
|  | says to close the file when an | 
|  | .IR exec (3) | 
|  | or | 
|  | .I execl | 
|  | system call is made; | 
|  | .B ORCLOSE | 
|  | says to remove the file when it is closed (by everyone who has a copy of the file descriptor); | 
|  | and | 
|  | .B OAPPEND | 
|  | says to open the file in append-only mode, so that writes | 
|  | are always appended to the end of the file. | 
|  | .I Open | 
|  | fails if the file does not exist or the user does not have | 
|  | permission to open it for the requested purpose | 
|  | (see | 
|  | .IR stat (3) | 
|  | for a description of permissions). | 
|  | The user must have write permission on the | 
|  | .I file | 
|  | if the | 
|  | .B OTRUNC | 
|  | bit is set. | 
|  | For the | 
|  | .I open | 
|  | system call | 
|  | (unlike the implicit | 
|  | .I open | 
|  | in | 
|  | .IR exec (3)), | 
|  | .B OEXEC | 
|  | is actually identical to | 
|  | .BR OREAD . | 
|  | .PP | 
|  | .I Create | 
|  | creates a new | 
|  | .I file | 
|  | or prepares to rewrite an existing | 
|  | .IR file , | 
|  | opens it according to | 
|  | .I omode | 
|  | (as described for | 
|  | .IR open ), | 
|  | and returns an associated file descriptor. | 
|  | If the file is new, | 
|  | the owner is set to the userid of the creating process group; | 
|  | the group to that of the containing directory; | 
|  | the permissions to | 
|  | .I perm | 
|  | ANDed with the permissions of the containing directory. | 
|  | If the file already exists, | 
|  | it is truncated to 0 length, | 
|  | and the permissions, owner, and group remain unchanged. | 
|  | The created file is a directory if the | 
|  | .B DMDIR | 
|  | bit is set in | 
|  | .IR perm , | 
|  | an exclusive-use file if the | 
|  | .B DMEXCL | 
|  | bit is set, and an append-only file if the | 
|  | .B DMAPPEND | 
|  | bit is set. | 
|  | Exclusive-use files may be open for I/O by only one client at a time, | 
|  | but the file descriptor may become invalid if no I/O is done | 
|  | for an extended period; see | 
|  | .IR open (9p). | 
|  | .PP | 
|  | .I Create | 
|  | fails if the path up to the last element of | 
|  | .I file | 
|  | cannot be evaluated, if the user doesn't have write permission | 
|  | in the final directory, if the file already exists and | 
|  | does not permit the access defined by | 
|  | .IR omode , | 
|  | of if there there are no free file descriptors. | 
|  | In the last case, the file may be created even when | 
|  | an error is returned. | 
|  | .\" If the file is new and the directory in which it is created is | 
|  | .\" a union directory (see | 
|  | .\" .IR intro (3)) | 
|  | .\" then the constituent directory where the file is created | 
|  | .\" depends on the structure of the union: see | 
|  | .\" .IR bind (3). | 
|  | .PP | 
|  | Since | 
|  | .I create | 
|  | may succeed even if the file exists, a special mechanism is necessary | 
|  | for those applications that require an atomic create operation. | 
|  | If the | 
|  | .B OEXCL | 
|  | .RB ( 0x1000 ) | 
|  | bit is set in the | 
|  | .I mode | 
|  | for a | 
|  | .IR create, | 
|  | the call succeeds only if the file does not already exist; | 
|  | see | 
|  | .IR open (9p) | 
|  | for details. | 
|  | .PP | 
|  | .I Close | 
|  | closes the file associated with a file descriptor. | 
|  | Provided the file descriptor is a valid open descriptor, | 
|  | .I close | 
|  | is guaranteed to close it; there will be no error. | 
|  | Files are closed automatically upon termination of a process; | 
|  | .I close | 
|  | allows the file descriptor to be reused. | 
|  | .SH SOURCE | 
|  | .B \*9/src/lib9 | 
|  | .SH SEE ALSO | 
|  | .IR intro (3), | 
|  | .IR stat (3) | 
|  | .SH DIAGNOSTICS | 
|  | These functions set | 
|  | .IR errstr . | 
|  | .SH BUGS | 
|  | Not all functionality is supported on all systems. | 
|  | .PP | 
|  | The | 
|  | .B DMAPPEND | 
|  | bit is not supported on any systems. | 
|  | .PP | 
|  | The implementation of | 
|  | .B ORCLOSE | 
|  | is to unlink the file after opening it, causing problems | 
|  | in programs that try to access the file by name before it is closed. | 
|  | .PP | 
|  | To avoid name conflicts with the underlying system, | 
|  | .I open | 
|  | and | 
|  | .I create | 
|  | are preprocessor macros defined as | 
|  | .IR p9open | 
|  | and | 
|  | .IR p9create ; | 
|  | see | 
|  | .IR intro (3). |