| From 1dcacd2cfdce9695c9e66e21d6ec0292d66da400 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Date: Fri, 12 Jun 2020 12:11:39 +0200 |
| Subject: [PATCH 4/4] readfile.2 |
| |
| --- |
| readfile.2 | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 229 insertions(+) |
| create mode 100644 readfile.2 |
| |
| --- /dev/null |
| +++ b/readfile.2 |
| @@ -0,0 +1,229 @@ |
| +.\" This manpage is Copyright (C) 2020 Greg Kroah-Hartman; |
| +.\" and Copyright (C) 2020 The Linux Foundation |
| +.\" |
| +.\" %%%LICENSE_START(VERBATIM) |
| +.\" Permission is granted to make and distribute verbatim copies of this |
| +.\" manual provided the copyright notice and this permission notice are |
| +.\" preserved on all copies. |
| +.\" |
| +.\" Permission is granted to copy and distribute modified versions of this |
| +.\" manual under the conditions for verbatim copying, provided that the |
| +.\" entire resulting derived work is distributed under the terms of a |
| +.\" permission notice identical to this one. |
| +.\" |
| +.\" Since the Linux kernel and libraries are constantly changing, this |
| +.\" manual page may be incorrect or out-of-date. The author(s) assume no |
| +.\" responsibility for errors or omissions, or for damages resulting from |
| +.\" the use of the information contained herein. The author(s) may not |
| +.\" have taken the same level of care in the production of this manual, |
| +.\" which is licensed free of charge, as they might when working |
| +.\" professionally. |
| +.\" |
| +.\" Formatted or processed versions of this manual, if unaccompanied by |
| +.\" the source, must acknowledge the copyright and authors of this work. |
| +.\" %%%LICENSE_END |
| +.\" |
| +.TH READFILE 2 2020-06-12 "Linux" "Linux Programmer's Manual" |
| +.SH NAME |
| +readfile \- read a file into a buffer |
| +.SH SYNOPSIS |
| +.nf |
| +.B #include <unistd.h> |
| +.PP |
| +.BI "ssize_t readfile(int " dirfd ", const char *" pathname ", void *" buf \ |
| +", size_t " count ", int " flags ); |
| +.fi |
| +.SH DESCRIPTION |
| +.BR readfile () |
| +attempts to open the file specified by |
| +.IR pathname |
| +and to read up to |
| +.I count |
| +bytes from the file into the buffer starting at |
| +.IR buf . |
| +It is to be a shortcut of doing the sequence of |
| +.BR open () |
| +and then |
| +.BR read () |
| +and then |
| +.BR close () |
| +for small files that are read frequently, such as those in |
| +.B procfs |
| +or |
| +.BR sysfs . |
| +.PP |
| +If the size of file is smaller than the value provided in |
| +.I count |
| +then the whole file will be copied into |
| +.IR buf . |
| +.PP |
| +If the file is larger than the value provided in |
| +.I count |
| +then only |
| +.I count |
| +number of bytes will be copied into |
| +.IR buf . |
| +.PP |
| +The argument |
| +.I flags |
| +may contain one of the following |
| +.IR "access modes" : |
| +.BR O_NOFOLLOW ", or " O_NOATIME . |
| +.PP |
| +If the pathname given in |
| +.I pathname |
| +is relative, then it is interpreted relative to the directory |
| +referred to by the file descriptor |
| +.IR dirfd . |
| +.PP |
| +If |
| +.I pathname |
| +is relative and |
| +.I dirfd |
| +is the special value |
| +.BR AT_FDCWD , |
| +then |
| +.I pathname |
| +is interpreted relative to the current working |
| +directory of the calling process (like |
| +.BR open ()). |
| +.PP |
| +If |
| +.I pathname |
| +is absolute, then |
| +.I dirfd |
| +is ignored. |
| +.SH RETURN VALUE |
| +On success, the number of bytes read is returned. |
| +It is not an error if this number is smaller than the number of bytes |
| +requested; this can happen if the file is smaller than the number of |
| +bytes requested. |
| +.PP |
| +On error, \-1 is returned, and |
| +.I errno |
| +is set appropriately. |
| +.SH ERRORS |
| +.TP |
| +.B EAGAIN |
| +The file descriptor |
| +.I fd |
| +refers to a file other than a socket and has been marked nonblocking |
| +.RB ( O_NONBLOCK ), |
| +and the read would block. |
| +See |
| +.BR open (2) |
| +for further details on the |
| +.BR O_NONBLOCK |
| +flag. |
| +.TP |
| +.BR EAGAIN " or " EWOULDBLOCK |
| +.\" Actually EAGAIN on Linux |
| +The file descriptor |
| +.I fd |
| +refers to a socket and has been marked nonblocking |
| +.RB ( O_NONBLOCK ), |
| +and the read would block. |
| +POSIX.1-2001 allows either error to be returned for this case, |
| +and does not require these constants to have the same value, |
| +so a portable application should check for both possibilities. |
| +.TP |
| +.B EBADF |
| +.I fd |
| +is not a valid file descriptor or is not open for reading. |
| +.TP |
| +.B EFAULT |
| +.I buf |
| +is outside your accessible address space. |
| +.TP |
| +.B EINTR |
| +The call was interrupted by a signal before any data was read; see |
| +.BR signal (7). |
| +.TP |
| +.B EINVAL |
| +.I fd |
| +is attached to an object which is unsuitable for reading; |
| +or the file was opened with the |
| +.B O_DIRECT |
| +flag, and either the address specified in |
| +.IR buf , |
| +the value specified in |
| +.IR count , |
| +or the file offset is not suitably aligned. |
| +.TP |
| +.B EINVAL |
| +.I fd |
| +was created via a call to |
| +.BR timerfd_create (2) |
| +and the wrong size buffer was given to |
| +.BR read (); |
| +see |
| +.BR timerfd_create (2) |
| +for further information. |
| +.TP |
| +.B EIO |
| +I/O error. |
| +This will happen for example when the process is in a |
| +background process group, tries to read from its controlling terminal, |
| +and either it is ignoring or blocking |
| +.B SIGTTIN |
| +or its process group |
| +is orphaned. |
| +It may also occur when there is a low-level I/O error |
| +while reading from a disk or tape. |
| +A further possible cause of |
| +.B EIO |
| +on networked filesystems is when an advisory lock had been taken |
| +out on the file descriptor and this lock has been lost. |
| +See the |
| +.I "Lost locks" |
| +section of |
| +.BR fcntl (2) |
| +for further details. |
| +.TP |
| +.B EISDIR |
| +.I fd |
| +refers to a directory. |
| +.PP |
| +Other errors may occur, depending on the object connected to |
| +.IR fd . |
| +.SH CONFORMING TO |
| +SVr4, 4.3BSD, POSIX.1-2001. |
| +.SH NOTES |
| +The types |
| +.I size_t |
| +and |
| +.I ssize_t |
| +are, respectively, |
| +unsigned and signed integer data types specified by POSIX.1. |
| +.PP |
| +On Linux, |
| +.BR read () |
| +(and similar system calls) will transfer at most |
| +0x7ffff000 (2,147,479,552) bytes, |
| +returning the number of bytes actually transferred. |
| +.\" commit e28cc71572da38a5a12c1cfe4d7032017adccf69 |
| +(This is true on both 32-bit and 64-bit systems.) |
| +.PP |
| +On NFS filesystems, reading small amounts of data will update the |
| +timestamp only the first time, subsequent calls may not do so. |
| +This is caused |
| +by client side attribute caching, because most if not all NFS clients |
| +leave |
| +.I st_atime |
| +(last file access time) |
| +updates to the server, and client side reads satisfied from the |
| +client's cache will not cause |
| +.I st_atime |
| +updates on the server as there are no |
| +server-side reads. |
| +UNIX semantics can be obtained by disabling client-side attribute caching, |
| +but in most situations this will substantially |
| +increase server load and decrease performance. |
| +.SH BUGS |
| +None yet! |
| +.SH SEE ALSO |
| +.BR close (2), |
| +.BR open (2), |
| +.BR openat (2), |
| +.BR read (2), |
| +.BR fread (3) |