Linux系统编程(1) —— 文件IO
来源:互联网 发布:淘宝外贸男装店推荐 编辑:程序博客网 时间:2024/06/16 17:40
本文主要对Linux系统中文件I/O的基本操作进行说明。
在Linux系统编程中,对文件进行处理的流程,通常是:
- 打开文件
- 读写文件
- 关闭文件
Linux内核对每一个进程维护一个打开的文件列表, 该文件列表称为文件表(file table).
而对该文件表进行访问时,是通过一个整数进行索引,该整数索引称为文件描述符(file descriptor,简称fds)
文件表中各个表项包含打开的文件的如下信息:
- 指针 -—— 指向文件备份索引节点在内存中的拷贝
- 相关的元数据 —— 文件位置和访问模式
在用户空间和内核空间都使用文件描述符(fds)作为唯一的cookies
打开一个文件,返回一个文件描述符。在后续的操作中,比如读取文件,写文件等。都使用文件描述符作为入参来调用对应的操作函数。
文件描述符使用C语言中的int类型来表示。
Linux进程有一个打开最大文件个数的限制。 文件描述符从0开始,逐步增加直到最大的值。缺省情况下为1024, 可以配置最大为1048576.
负值通常认为是非法的文件描述符。-1通常表示返回的错误值。
注:
每个进程按惯例至少有三个文件描述符:0,1和2
文件描述符0(fds 0):标准输入
文件描述符1(fds 1):标准输出
文件描述符2(fds 2):标准错误
不过进程可以显式的关闭它们。
在C库中,定义了预处理宏:
SDTIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
SDTIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
通常, stdin:连接终端的输入设备(通常用户键盘)
stdout和stderr:连接到终端的输出设备(通常显示屏)
不过通常也重定向这些标准文件描述符。以及通过pipe把一个程序的输出作为另一个程序的输入。
这些就是shell实现的重定向和管道(pipes)
缺省情况下,子进程获得父进程的文件表的拷贝, 即打开的文件列表,访问模式,当前文件位置和其他一些元数据都是一样的。
但是有一点区别, 子进程关闭一个文件,不影响其他进程的文件表。 这让子进程和父进程共享文件列表成为可能(例如thread)。
打开文件
open()系统调用
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open (const char *name, int flags);int open (const char *name, int flags, mode_t mode);
const char *name: 文件名
int flag: 是按bit位进行或操作的。它必须包括一个访问模式(例如O_RDONLY, O_WRONLY或O_RDWR)
举例:
int fd;fd = open ("/home/fantasy/text", O_RDONLY);if (fd == −1) /* error */
该段代码表示打开的文件,只能进行读取,不能进行写操作。
flag的取值,可从下表中获取进行bit位或操作
flga标志作用O_APPEND追加模式O_ASYNC只能用于FIFO,管道,sockets和terminal,不能用于普通文件O_CLOEXEC O_CREAT若文件不存在,将创建该文件,若文件已存在,这该表示无效除非指定了O_EXCLO_DIRECT O_DIRECTORY O_EXCL O_LARGEFILE O_NOATIME+ O_NOCTTY O_NOFOLLOW O_NONBLOCK O_SYNC O_TRUNC
mode_t mode:
mode标志作用S_IRWXUOwner has read, write, and execute permissionS_IRUSEROwner has read permissionS_IWUSEROwner has write permissionS_IXUSEROwner has execute permissionS_IRWXGGroup has read, write, and execute permissionS_IRGRPGroup has read permissionS_IWGRPGroup has write permissionS_IXGRPGroup has execute permissionS_IRWXOEveryone else has read, write, and execute permissionS_IROTHEveryone else has read permissionS_IWOTHEveryone else has write permissionS_IXOTHEveryone else has execute permission
creat()函数
creat()函数
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int creat (const char *name, mode_t mode);
读取文件
read()系统调用
#include <unistd.h>ssize_t read (int fd, void *buf, size_t len);
从文件中读取len长度的字节到buf指向的内存空间中。该函数的返回值是写入buf中的字节数。若返回-1,表示read失败。
同时文件的读取位置向后移动读取的字节数。
写入文件
write系统调用
#include <unistd.h>ssize_t write (int fd, const void *buf, size_t count);
从buf中写count字节到文件的当前位置。
关闭文件
当程序完成了对文件的操作后,调用close()系统调用来关闭该文件
#include <unistd.h>int close (int fd);
调用close()对,对应的描述符就不再有效。
close()返回0表示成功,返回-1表示错误。
if (close (fd) == −1) perror ("close");
实例:
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#define BUF_SIZE 1024int main(){ int from_fd; int to_fd; to_fd = open("/home/fantasy/test.txt", O_WRONLY | O_CREAT); if (-1 == to_fd) { printf("open the file fail\n"); } const char *buf = "write file!"; ssize_t nr; nr = write(to_fd, buf, strlen(buf)); if (-1 == nr) { printf("write the file fail\n"); } from_fd = open("/home/fantasy/test.txt", O_RDONLY); if (-1 == from_fd) { printf("open the file fail\n"); } char read_buf[BUF_SIZE]; nr = read(from_fd, read_buf, BUF_SIZE); if (-1 == nr) { printf("read the file fail\n"); } else { printf("readbuf = %s\n", read_buf); } close(to_fd); close(from_fd);}
0 0
- Linux系统编程(1) —— 文件IO
- 嵌入式 Linux系统编程(一)——文件IO
- Linux系统编程文件IO
- Linux系统编程(2)——文件与IO之系统调用与文件IO操作
- linux系统编程之文件io小结
- 【Linux系统编程】文件IO操作
- Linux系统编程-文件IO函数
- Linux系统编程-文件IO(一)
- linux系统编程-文件IO操作
- Linux编程——文件 IO操作
- Linux系统编程(3)——文件与IO之fcntl函数
- Linux系统编程(4)——文件与IO之ioctl函数
- Linux系统编程(5)——文件与IO之mmap函数
- Unix系统编程(1) - 文件IO
- Linux文件IO编程
- linux系统编程-文件与IO(一)
- Linux学习记录--文件IO操作相关系统编程
- Linux文件---文件IO编程
- hbase 12.1 regionserver 宕机报错记录——1
- NavigationController返回按钮颜色和文字
- picasso_强大的Android图片下载缓存库
- Docker镜像和仓库笔记
- 浅谈Java中的hashcode方法
- Linux系统编程(1) —— 文件IO
- IOS控件之UITextField用法及注意点
- Executor框架简介
- BufferedInputStream和BufferedOutputStream类
- python导入模块的4种方法
- CoordinatorLayout的详细介绍
- BufferedOutputStream 源码分析
- BaseAdapter学习
- 【爬虫-反爬虫】系列二:【文章精选1】-互联网网站的反爬虫策略浅析