头文件包含路径
linux 操作系统分为两大空间:用户空间和内核空间
这样划分,是为了保护内核的核心组件,不被轻易访问和修改
系统调用:安全的访问内核空间
其核心是:函数API(API:用户编程接口)
所谓系统调用是指操作系统提供给用户的组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的的服务
学习linux应用编程,就是学习使用API【API需要阅读手册——参考man手册、linux c手册】
硬件中断
2.
文件编程
文件IO:一切皆为文件(内核中虚拟文件系统(VFS));用文件系统来管理
文件IO:
文件分为四大类:-普通文件、d目录文件、l链接文件和c/b设备文件(三小类:p管道文件、s套接字和f堆栈文件)
都可以用C库函数和API来调用
把一切抽象成文件,用统一的方式管理设备和文件,节省开发资源;用过文件来操作硬件
文件描述符:
知道一个文件的id(文件指针),操作该id就是操作该文件;
3.初级IO(creat及异常处理)
creat函数
1.宏定义 :
2.数字【0:八进制;3位8进制来表示文件的权限,r用4标识,w用2标识,x用1标识】
已经创建的文件,不能通过再creat来修改权限;
如何获取错误信息?
方法一:
errno:系统全局变量(所有应用都可以访问),用来保存错误编号(整数)
使用该变量时,要有<errno.h>这个头文件
方法二:perror --------------------常用-----------------------
方法三:
open函数
O_WRONLY:写 O_RDONLY:读 O_RWRD:可读可写
O_CREAT:不存在就创建;【O_EXCEL: O_CREAT存在时,打开已有的文件就报错】
O_APPEND:文件读写位置移到末尾; O_TRUNC:文件长度为零(清空)
O_NONBLOCK:非阻塞的方式打开;
close函数
假设有两个file descript指向同一个文件,可以close(fd1/fd2)都可以,也可以各close一次
read
write
lseek
lseek的返回值是,lseek操作后,文件读写位置距离文件首的距离(字节数),以此可以测量文件大小:
lseek(fd3, 0, SEEK_END); // 返回值是文件大小(字节数)
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
// int fd1;
// fd1 = creat(argv[1], S_IRWXU | S_IRWXG | S_IRWXO);
#if 0
// 第一种方法
if (errno == EISDIR)
{
printf("is a directory\n");
}
// 第二种方法:
perror("error is:");
// 第三种方法:
printf("%s\n", strerror(errno));
#endif
// printf("%d\n",fd1);
// int fd2=open(argv[1],O_RDWR);
// printf("%d\n",fd2);
// printf("%d\n",close(fd1));
// printf("%d\n",close(fd2));
int fd3 = open(argv[1], O_RDWR | O_CREAT, S_IRWXG | S_IRWXO | S_IRWXU);
char buffer[1024];
gets(buffer);
int w_num;
printf("%d\n", w_num = write(fd3, buffer, strlen(buffer)));
if (w_num == -1)
{
printf("write error\n");
exit(-1);
}
//lseek(fd3, 0, SEEK_SET);
//lseek(fd3, 0, SEEK_END); // 返回值是文件大小(字节数)
lseek(fd3, -w_num, SEEK_CUR);//将文件读写位置移到开头
int r_num;
r_num = read(fd3, buffer, strlen(buffer));
buffer[r_num] = '\0';
printf("read num:%d; read content:%s\n", r_num, buffer);
return 0;
}
获取文件属性:
struct stat file_a1;
//1.
stat("a.txt",&file_a1);
printf("stat.size=%ld\n",file_a1.st_size);//输出a.txt的大小;
//2.
struct stat file_a2;
fstat(fd3,&file_a2);
printf("fstat.size=%ld\n",file_a2.st_size);//输出a.txt的大小;
//3.
struct stat file_a3;
lstat("a.txt",&file_a3);
printf("lstat.size=%ld\n",file_a3.st_size);//输出a.txt的大小;