文档
READ(2) Linux Programmer's Manual READ(2)
NAME
read - read from a file descriptor
SYNOPSIS
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
DESCRIPTION
read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.
If count is zero, read() returns zero and has no other results. If count is greater than SSIZE_MAX, the result is unspecified.
RETURN VALUE
On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this number. It is not an
error if this number is smaller than the number of bytes requested; this may happen for example because fewer bytes are actually available right
now (maybe because we were close to end-of-file, or because we are reading from a pipe, or from a terminal), or because read() was interrupted
by a signal. On error, -1 is returned, and errno is set appropriately. In this case it is left unspecified whether the file position (if any)
changes.
ERRORS
EAGAIN The file descriptor fd refers to a file other than a socket and has been marked nonblocking (O_NONBLOCK), and the read would block.
EAGAIN or EWOULDBLOCK
The file descriptor fd refers to a socket and has been marked nonblocking (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.
EBADF fd is not a valid file descriptor or is not open for reading.
EFAULT buf is outside your accessible address space.
EINTR The call was interrupted by a signal before any data was read; see signal(7).
需要注意需要使光标回到文件开始处,否则读取不到文件。
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
#include<string.h>
#include<stdlib.h>
int main(){
// file description
int fd;
char *buf = "helloworld\n";
fd= open("./file1",O_RDWR);
if(fd==-1){
printf("open file1 fail\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd>0){
printf("create file1 success\n");
}
}
printf("open success:fd=%d\n",fd);
// ssize_t write(int fd, const void *buf, size_t count);
int n_write=write(fd,buf,strlen(buf));
if(n_write !=-1){
printf("write %d byte to file1\n",n_write);
}
close(fd);
fd= open("./file1",O_RDWR);
char *readBuf;
readBuf =(char *)malloc(sizeof(char)*n_write+1);
// ssize_t read(int fd, void *buf, size_t count);
int n_read= read(fd,readBuf,n_write);
printf("read %d ,context:%s\n",n_read,readBuf);
close(fd);
return 0;
}