Linux系统IO操作

概念

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 :可定位文件(可随机访问)当前的读/写位置。

open
头文件#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);
close
头文件#include <unistd.h>
函数原型int close (int fd);
参数列表fd已打开的文件描述符。
返回值成功0。
失败-1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。
read
头文件#include <unistd.h>
函数原型ssize_t read (int fd, void *buf, size_t count);
参数列表fd已打开的文件描述符。
buf存储读出数据的缓冲区。
count要求读出的字节数。
返回值成功真实读出的字节数。
0以读到文件的末尾。
失败-1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。
write
头文件#include <unistd.h>
函数原型ssize_t write (int fd, const void *buf, size_t count);
参数列表fd已打开的文件描述符。
buf将要写入数据的缓冲区。
count要求写入的字节数。
返回值成功真实写入的字节数。
失败-1。通过errno全局变量获取错误码,strerror(errno)获取错误信息。
lseek
头文件#include <unistd.h>
#include <sys/types.h>
函数原型off_t lseek (int fd, off_t offset, int whence);
参数列表fd已打开的文件描述符。
offset偏移量(相对参数3),单位是字节,可正负。
whenceSEEK_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库)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值