Linux系统编程即为通过调用系统函数和C语言库函数实现对内核的操作,对不太了解底层原理的开发者来说,就是通过引入对应的头文件从而直接使用对应的API接口函数。
1.简单的文件IO操作。
常用函数解析:
(1)打开文件
int fd = open("./app.c", O_RDWR)
if (-1 == fd)
return fd;
解析:以可读可写的方式打开app.c文件。
(2)读文件
ret = read(fd1, buffer, sizeof(buffer));
解析:从文件中读取sizeof(buffer)个字节数据,将数据存放到buffer中。
(3)写文件
write(fd2, buffer, sizeof(buffer));
解析:将buffer中的数据写入打开的文件中。
(4)关闭文件
close(fd);
解析:关闭对应的文件,参数fd为文件描述符,每个文件的操作都有对应的文件描述符,都不一样,范围0-1023,当操作失败时会返回负值。
(5)定位文件偏移量
1.将读写位置移动到文件开头处: off_t off = lseek(fd, 0, SEEK_SET); if (-1 == off) return -1;
2.将读写位置移动到文件末尾: off_t off = lseek(fd, 0, SEEK_END); if (-1 == off) return -1;
3.将读写位置移动到偏移文件开头100个字节处: off_t off = lseek(fd, 100, SEEK_SET);
if (-1 == off) return -1;
4.获取当前读写位置偏移量: off_t off = lseek(fd, 0, SEEK_CUR); if (-1 == off) return -1;
函数执行成功将返回文件当前读写位置。
调用以上函数时有返回值为负数的情况,返回负值则说明文件操作失败,那到底是什么原因导致的失败呢,则需要调用以下函数。
2.返回错误处理
操作文件失败会返回错误编号errno,该变量为全局变量,任何时候都可以直接调用,该值在不断的更新,例如printf("%d\n",errno);
但是即使知道了错误编号对程序开发者来说也是无意义的,因为通过该编号并不能确定错误的原因。针对这个问题,可以调用printf("Error: %s\n", strerror(errno));该函数会打印出错误原因,比如"No such file or directory",
或者调用perror()函数打印错误原因:
/* 打开文件 */ fd = open("./test_file", O_RDONLY);
if (-1 == fd)
{
perror("open error");
return -1;
}