COHERENT manpages
This page displays the COHERENT manpage for open() [Open a file].
List of available manpages
Index
open() -- System Call (libc)
Open a file
#include <fcntl.h>
int open(file, type[, mode])
char *file; int type; [int mode;]
open() opens a file to receive data, or to have its data read. When it
opens file, open() returns a file descriptor, which is a small, positive
integer that identifies the open file for subsequent calls to read(),
write(), close(), dup(), dup2(), or lseek(). After file is opened, reading
or writing begins at byte 0.
The second argument, type, determines how the file is opened. It is a
bitwise OR of flag bits taken from the following list (as defined in the
header file <fcntl.h>):
O_RDONLY Read only
O_WRONLY Write only
O_RDWR Read and write
One, and only one, of the above three bit values must be set in flag. The
following bit values can be used to describe further how the file can be
opened:
O_NDELAY Non-blocking I/O
O_APPEND Append (writes guaranteed at the file's end)
O_SYNC Sync on every write
O_TRACE For file system debugging (non-standard)
O_NONBLOCKNon-blocking I/O
O_CREAT Open with file create (third argument)
O_TRUNC Open with truncation
O_EXCL Exclusive open
O_NOCTTY Do not assign a controlling tty
The remaining bit values are used to how you wish to manipulate file:
O_APPEND
Precede every write with an automatic seek to end of file.
O_CREAT
If file does not exist, create it. If this flag is set the third
argument, mode, sets the mode on the file. Note that this mode will
be masked by umask(). See the Lexicon article on the command chmod for
details on what the various values of mode mean.
O_EXCL
Exclusive open: this flag is meaningful only if O_CREAT is also used.
In that case, open() fails with error value EEXIST if file already
exists.
O_NDELAY
No delay in writing to disk. Please note the following caveats when
using this flag:
If set:
Opening a FIFO with O_RDONLY returns without delay. Opening a
FIFO with O_WRONLY returns an error if no process has the file
open for reading. Opening a file associated with a communication
line returns without waiting for a carrier signal.
If not set:
Opening a FIFO with O_RDONLY blocks until a process opens the
file for writing. Opening a FIFO with O_WRONLY blocks until a
process opens the file for reading. Opening a file associated
with a communication line blocks until a carrier signal is
present.
O_NOCTTY
If file names a terminal device, do not set it to be the controlling
terminal for the process.
O_SYNC
All writes to file will be synchronous to disk. This means that
write() will not return until the data have been physically written to
disk.
O_TRUNC
If file exists, truncate it to zero length. You must have write
permissions on file to use this flag.
The third argument, mode, is significant only if O_CREAT is specified in
the second argument and if file did not exist before the call to open(). In
that case, mode specifies the access permissions of the new file, in
exactly the manner that the system call creat() uses its mode argument to
set permissions. The value of mode is typically given as either an octal
constant or bitwise OR of permission-bit values as defined in header file
<sys/stat.h>.
Example
This example copies the file named in argv[1] to the one named in argv[2]
by using system calls. It demonstrates open() plus the system calls
close(), read(), write(), and creat().
#include <stdio.h>
#include <fcntl.h>
#define BUFSIZE (20*512)
char buf[BUFSIZE];
void fatal(s)
char *s;
{
fprintf(stderr, "copy: %s\n", s);
exit(1);
}
main(argc, argv)
int argc; char *argv[];
{
register int ifd, ofd;
register unsigned int n;
if (argc != 3)
fatal("Usage: copy source destination");
if ((ifd = open(argv[1], O_RDONLY)) == -1)
fatal("cannot open input file");
if ((ofd = open(argv[2], O_CREAT | O_RDWR | O_TRUNC, 0666)) == -1)
fatal("cannot open output file");
/* For COHERENT 286, use creat() instead of open():
* if ((ofd = creat(argv[2], 0666)) == -1)
*/
while ((n = read(ifd, buf, BUFSIZE)) != 0) {
if (n == -1)
fatal("read error");
if (write(ofd, buf, n) != n)
fatal("write error");
}
if (close(ifd) == -1 || close(ofd) == -1)
fatal("cannot close");
exit(0);
}
See Also
fopen(),
file descriptor,
close(),
libc
ANSI Standard, §4.9.3
POSIX Standard, §5.3.1
Diagnostics
open() returns -1 if the file does not exist, if the caller lacks
permission, or if a system resource is exhausted.
Notes
open() is a low-level call that passes data directly to COHERENT. It
should not be mixed with high-level calls, such as fread(), fwrite(), or
fopen().
Code that uses the third argument to open() cannot be ported to COHERENT
286.
COHERENT release 4.2.10 changes some of the behaviors triggered by flags
O_EXCL and O_NDELAY. In previous release of COHERENT, flag O_EXCL COHERENT
would handle blocking subsequent open()s. This is no longer the case -- the
device driver must handle it. In previous release of COHERENT, when flag
O_NDELAY was used to open a character driver, the I/O flag IONDLY would be
set. Now, the I/O flag IONONBLOCK is set instead.



