Syntax
#include <unistd.h>
ssize_t read(int file_descriptor,
void *buf, size_t nbyte);
|
From the file or socket indicated by file_descriptor, the read() function reads nbyte bytes of input into the memory area indicated by buf. If nbyte is zero, read() returns a value of zero without attempting any other action.
If file_descriptor refers to a "regular file" (a stream file that can support positioning the file offset) or any other type of file on which the job can do an lseek() operation, read() begins reading at the file offset associated with file_descriptor. A successful read() changes the file offset by the number of bytes read.
If read() is successful and nbyte is greater than zero, the access time for the file is updated.
read() is not supported for directories.
If file_descriptor refers to a descriptor obtained using the open() function with O_TEXTDATA specified, the data is read from the file assuming it is in textual form. The data is converted from the code page of the file to the code page of the application, job, or system as follows:
If O_TEXTDATA was not specified on the open(), the data is read from the file without conversion. The application is responsible for handling the data.
In the QSYS.LIB file system, most end-of-file characters are symbolic; that is, they are stored outside the member. When reading:
See the Usage Notes for write()--Write to Descriptor.
When file_descriptor refers to a socket, the read() function reads from the socket identified by the socket descriptor.
Parameters
Authorities
No authorization is required.
Return Value
Error Conditions
If read() is not successful, errno usually indicates one of the following errors. Under some conditions, errno could indicate an error other than those listed here.
An attempt was made to access an object in a way forbidden by its object access permissions.
The thread does not have access to the specified file, directory, component, or path.
If you are accessing a remote file through the Network File System, update operations to file permissions at the server are not reflected at the client until updates to data that is stored locally by the Network File System take place. (Several options on the Add Mounted File System (ADDMFS) command determine the time between refresh operations of local data.) Access to a remote file may also fail due to different mappings of user IDs (UID) or group IDs (GID) on the local and remote systems.
This may occur if file_descriptor refers to a socket and the socket is using a connection-oriented transport service, and a connect() was previously completed. The thread, however, does not have the appropriate privileges to the objects that were needed to establish a connection. For example, the connect() required the use of an APPC device that the thread was not authorized to.
A file descriptor argument was out of range, referred to a file that was not open, or a read or write request was made to a file that is not open for that operation.
A given file descriptor or directory pointer is not valid for this operation. The specified descriptor is incorrect, or does not refer to an open file. Or, this read request was made to a file that was only open for writing.
The file ID table is missing or damaged.
To recover from this error, run the Reclaim Storage (RCLSTG) command as soon as possible.
An attempt was made to use a system resource that is not available at this time.
A referenced object is damaged. The object cannot be used.
In attempting to use an argument in a call, the system detected an address that is not valid.
While attempting to access a parameter passed to this function, the system detected an address that is not valid.
A function was passed incorrect argument values, or an operation was attempted on an object and the operation specified is not supported for that type of object.
An argument value is not valid, out of range, or NULL.
This may occur if file_descriptor refers to a socket that is using a connectionless transport service, is not a socket of type SOCK_RAW, and is not bound to an address.
The file resides in a file system that does not support large files, and the starting offset of the file exceeds 2GB minus 2 bytes.
A physical I/O error occurred.
A referenced object may be damaged.
A function needed to allocate storage, but no storage is available.
There is not enough memory to perform the requested function.
The object's data size exceeds the limit allowed by this function.
The file is a regular file, nbyte is greater than 0, the starting offset is before the end-of-file, and the starting offset is greater than or equal to 2GB minus 2 bytes.
If you are accessing a remote file through the Network File System, the file may have been deleted at the server.
The operation failed because of an unknown system state. See any messages in the job log and correct any errors that are indicated, then retry the operation.
When the descriptor refers to a socket, errno could indicate one of the following errors:
This error code indicates that the transport provider ended the connection abnormally because of one of the following:
This error code is returned only on sockets that use a connection-oriented transport service.
A non-blocking connect() was previously completed that resulted in the connection timing out. No connection is established. This error code is returned only on sockets that use a connection-oriented transport service.
If interaction with a file server is required to access the object, errno could indicate one of the following errors:
If you are accessing a remote file through the Network File System, the file may have been deleted at the server.
Error Messages
The following messages may be sent from this function:
Usage Notes
The file access time for a database member is updated using the normal rules that apply to database files. At most, the access time is updated once per day.
If you previously used the integrated file system interface to manipulate a member that contains an end-of-file character, you should avoid using other interfaces (such as the Source Entry Utility or database reads and writes) to manipulate the member. If you use other interfaces after using the integrated file system interface, the end-of-file information will be lost.
The file access time is not updated on a read() operation.
Local access to remote files through the Network File System may produce unexpected results due to conditions at the server. Once a file is open, subsequent requests to perform operations on the file can fail because file attributes are checked at the server on each request. If permissions on the file are made more restrictive at the server or the file is unlinked or made unavailable by the server for another client, your operation on an open file descriptor will fail when the local Network File System receives these updates. The local Network File System also impacts operations that retrieve file attributes. Recent changes at the server may not be available at your client yet, and old values may be returned from operations. (Several options on the Add Mounted File System (ADDMFS) command determine the time between refresh operations of local data.)
Reading and writing to files with the Network File System relies on byte-range locking to guarantee data integrity. To prevent data inconsistency, use the fcntl() API to get and release these locks.
QFileSvr.400 File System Differences
The largest buffer size allowed is 16 megabytes. If a larger buffer is
passed, the error EINVAL will be received.
Related Information
Example
The following example opens a file and reads input:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
main() {
int ret, file_descriptor;
char buf[]="Test text";
file_descriptor = creat("test.output", S_IWUSR);
write(file_descriptor, buf, sizof(buf)-1);
close(file_descriptor);
if ((file_descriptor = open("test.output", O_RDONLY)) < 0)
perror("open() error");
else {
ret = read(file_descriptor, buf, sizeof(buf)-1));
buf[ret] = 0x00;
printf("block read: \n<%s>\n", buf);
close(file_descriptor);
}
unlink("test.output");
}
Output:
block read: <Test text>
| Top | Integrated File System APIs | APIs by category |
| [Information Center Home Page | Feedback ] | [Legal | AS/400 Glossary] |