操作系统:管理所有资源,把不同设备和不同程序关联起来
Linux系统编程:在操作系统的环境下编程,使用操作系统提供的系统调用和各种库,对系统资源访问。
本质:对硬件设备操作
对Linux内核操作的方法: 1.shell脚本
2. 库函数(c语言)
3. 应用层系统调用 (还是调用函数)(c语言)
shell脚本是一种操作内核的方法,本文为c语言操作内核
文章目录
1. Linux C编程方法
1.写好文件(可以再编译器内写)并保存,保存的文件形式为:
文件名.c
2.终端内编译:
gcc 文件名.c ----》 变为:文件名.out
3.终端内运行:
./文件名.out
2.文件描述符
形式:非负整数(0,1,2 …)
概念: 打开/创建 文件时,系统内核会返回一个文件描述符(返回一个数字),
fd = (open("文件名.txt", O_RDONLY)
fd就是此文件的 “文件描述符”
这个数字(文件描述符)对应此文件
操作文件,就是操作这些数字
程序运行时,系统自动创建三个数字:
0 标准输入
1 标准输出
2 标准输出出错
程序或进程运行的时候,自动分配0 1 2
所以:创建的文件后,返回值的描述符都是从3开始
3.创建文件(open)描述符
3.1 函数组成
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
打开/创建 文件,并返回文件描述符:
1.存在此文件:
int open(const char *pathname, int flags);
2.不存在此文件,创建文件:
int open(const char *pathname, int flags, mode_t mode);
路径文件名 标志位 文件权限设置(可读、可写、可执行)
编译正确:
返回值是从3(上文解释了)
编译错误:
返回值—1
flags标志位:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_EXCL 一般与O_CREAT一起使用,标识如果文件存在则报错
O_TRUNC 如果文件存在则清空
O_APPEND 如果文件存在则追加
O_CREAT 文件不存在则创建,需要通过第三个参数设置文件权限
只有这个采用第二种代码
返回值:
创建文件用的代码是 int (上图代码),所以直接创建一个int类型变量就能接收上述创建代码,这就是返回值
成功:
return 文件描述符 (从3开始,因为012是运行进程的时候就返回过了,按顺序向后递增文件描述符)
失败:
return -1
3.2 函数调用失败时,输出错误信息
头文件及返回值:
#include <errn.h> 引入 errno全局变量 ,获取错误码
#include<stdio.h> 引入函数perror, 输出错误信息
perror的返回值类型和传参: void perror(const char *s);
errno获取的是个数字,需要查询数字对应哪种错误,不方便
perror获取错误信息,直接得到错误原因
使用代码:
if( 命令 == 此命令失败时的文件描述符数字) {
perror("xxxxxx"); }
输出结果:
xxxx:错误信息
4. 关闭文件(close)描述符
操作文件的描述符
头文件及返回值:
#include<unistd.h> fd:创建文件所返回的文件描述符
close返回值类型和传参:int close(int fd)
使用代码:
创建文件:(这里为了方便,不写头文件)
int fd ;
fd = open("文件名.txt" ,标志位) 获取文件的描述符
close(fd);
返回值
成功:
return 0;
失败:
return -1;
5. 对文件写操作(write)
头文件及返回值:
#include<unistd.h>
write返回值类型和传参: ssize_t wrete ( int fd , const void *buf , size_t cout );
文件描述符 数据内容 写入数据字节数
代码:
1.向终端写数据:
write ( 1 , "hello world" , 12);
写给终端:
标准输出1
2.向文件写数据:
打开文件:
int fd ;
fd = open("文件名.txt", 标志位); 保存文件的 文件描述符
写入数据:
write( fd , "hello world" ,12);
返回值:
成功:
return 数据字节个数;
失败:
return -1; 可以用perror打印错误信息
6. 对文件读操作(read)
基本同上write的函数
区别:
创建一个字符串 用来写入数据 (从fd文件里 ,读取一定字节,放到这个字符串内)
char p[32]="";
read(文件描述符, 把读取的数据保存位置的首地址, 读取字节数)
从终端读入,标准输入符0 p 30
写给某文件,用此文件的fd
成功:
return 数据字节个数;
失败:
return -1; 可以用perror打印错误信息
读取到末尾:
return 0;
7. 删除文件(remove)
头文件及返回值:
#include<stdio.h>
返回类型及传参 int remove(const char* pathname)
成功: return 0;
失败: return -1;
代码:
remove( "./文件名");
路径