概念
Linux中,一切(差不多)都是文件。
常见文件类型:普通文件、目录文件、链接文件、设备文件、管道文件。常见文件权限:可读(r)、可写(w)、可执行(x)、无权限(-)。
Linux系统函数按功能逻辑大致分类:进程控制、进程间通讯、文件系统控制、系统控制、存储管理、网络管理、socket控制、用户管理等。
Linux系统IO特点:不带缓冲区、通过文件描述符(int)访问文件。
标准IO(标准C库)特点:带缓冲区、通过FILE*访问文件。
Linux程序开始运行时,默认打开3个文件:标准输入(0)、标准输出(1)、标准出错处理(2);文件描述符对应宏分别是:STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。
函数介绍
open :打开或创建文件。
close :关闭文件。
read :读取文件。
write :写入文件。
lseek :可定位文件(可随机访问)当前的读/写位置。
头文件 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> | |
函数原型 | int open (const char *pathname, int flags, mode_t mode); | |
参数列表 | pathname | 要打开的文件名(可带路径)。 |
flag: 文件打开模式 | O_CREAT :创建文件,已存在以只读方式打开。 | |
O_EXCL :与O_CREAT配合,测试文件是否存在,存在返回错误。 | ||
O_TRUNC :与O_CREAT配合,文件存在,则把文件清空。 | ||
O_APPEN :以追加方式打开。 | ||
O_RDONLY :以只读方式打开(read only)。 | ||
O_WRONLY :以只写方式打开(write only)。 | ||
O_RDWR :以读写方式打开。 | ||
... | ||
mode | 创建文件时用到的权限值(int),0664(rw-rw-r—)。 | |
返回值 | 成功 | 文件描述符(int)。 |
失败 | -1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。 | |
扩展函数 | int open (const char *pathname, int flags); | |
int create (const char *pathname, mode_t mode); |
头文件 | #include <unistd.h> | |
函数原型 | int close (int fd); | |
参数列表 | fd | 已打开的文件描述符。 |
返回值 | 成功 | 0。 |
失败 | -1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。 |
头文件 | #include <unistd.h> | |
函数原型 | ssize_t read (int fd, void *buf, size_t count); | |
参数列表 | fd | 已打开的文件描述符。 |
buf | 存储读出数据的缓冲区。 | |
count | 要求读出的字节数。 | |
返回值 | 成功 | 真实读出的字节数。 |
0 | 以读到文件的末尾。 | |
失败 | -1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。 |
头文件 | #include <unistd.h> | |
函数原型 | ssize_t write (int fd, const void *buf, size_t count); | |
参数列表 | fd | 已打开的文件描述符。 |
buf | 将要写入数据的缓冲区。 | |
count | 要求写入的字节数。 | |
返回值 | 成功 | 真实写入的字节数。 |
失败 | -1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。 |
头文件 | #include <unistd.h> #include <sys/types.h> | |
函数原型 | off_t lseek (int fd, off_t offset, int whence); | |
参数列表 | fd | 已打开的文件描述符。 |
offset | 偏移量(相对参数3),单位是字节,可正负。 | |
whence | SEEK_SET :文件开头位置。 | |
SEEK_CUR :文件当前位置。 | ||
SEEK_END :文件结尾位置。 | ||
... | ||
返回值 | 成功 | 文件当前的距离文件头的偏移量。 |
失败 | -1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。 |
代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(int argc, char *argv[])
{
int fd = 0;
fd = open(argv[1], O_CREAT | O_RDWR, 0664);
//fd = creat(argv[1], 0664);
if (fd == -1)
{
printf("open %s failed: %s\n", argv[1], strerror(errno));
return -1;
}
printf("open %s ok id: %d\n", argv[1], fd);
char buf[1024];
int ret = 0;
printf("cur pos: %d\n", lseek(fd, 0, SEEK_CUR));
ret = read(fd, buf, 1024);
if (ret == -1)
{
printf("read file failed: %s\n", strerror(errno));
}
buf[ret] = '\0';
printf("read %dbyte data: %s\n", ret, buf);
printf("cur pos: %d\n", lseek(fd, 0, SEEK_CUR));
printf("cur pos: %d\n", lseek(fd, -3, SEEK_CUR));
ret = write(fd, "abc", strlen("abc"));
if (ret == -1)
{
printf("write data failed: %s\n", strerror(errno));
}
ret = close(fd);
if (ret == -1)
{
printf("close file failed: %s\n", strerror(errno));
}
return 0;
}
扩展
标准IO操作(标准C库)。