目录
课程视频链接
笔记目的
什么是系统编程
如何操作内核的系统调用
系统调用的分类编辑
系统调用的返回值
系统调用IO函数
文件描述符
文件IO文件描述符与标准IO的文件指针对应关系
Man手册使用
open函数
函数调用失败打印错误
close函数
测试一个进程最多能产生多少个文件描述符
文件描述符值的规律
write函数
read函数
读数据需要注意的问题
lseek函数
remove函数
课程视频链接
3-2.01 系统编程概述_哔哩哔哩_bilibili
笔记目的
复习一遍学习过的知识,该视频的知识较于基础,涉及到的深层知识并不多,适合入门推荐。
开发的时候直接对着一本书即可,查书即可
什么是系统编程
如何操作内核的系统调用
操作内核的系统调用是因为为了操作硬件,而只有内核才能直接操作硬件设备
系统调用本质上就是操作系统提供给用户程序的一组特殊的函数接口,我们使用这些函数,对内核进行操作,从而对硬件进行操作------系统调用的学习就是学会灵活使用库函数(基础知识+编程能力)所以说系统调用:就是利用别人已经给好的函数进行编程处理
系统调用的分类
系统调用的返回值
可以理解为系统调用函数的返回值,一般我们使用函数的时候,都是需要判断函数是否成功使用,就跟FreeRTOS判断任务是否成功创建一样的,但是FreeRTOS的函数不会返回错误的原因,虽然一般任务创建失败的原因是空间不足。但是系统调用函数却可以返回函数错误信息,并且打印出来---------关键字(error、perror)
系统调用IO函数
文件描述符
文件描述符类似于C语言中的文件指针
文件IO文件描述符与标准IO的文件指针对应关系
Man手册使用
man man:查看man手册使用
man 2 open:查看open函数使用
open函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname:路径(绝对路径和相对路径)
如果要同时使用多个标志,中间使用按位或运算符(‘|’) 连接
Mode一般以八进制出现
返回值
成功时返回文件描述符,文件描述符是一个非负整数,失败时返回 -1
文件IO与标准IO权限对比
由于指定了0_CREAT因此需要Mode的参与。上面的东西不需要记录需要的时候来查询即可
int fd ;
fd = open("file.txt", O_RDONLY | O_CREAT, 0664);
printf("%d\r",fd);
函数调用失败打印错误
头文件添加:#include <errno.h>
int fd ;
fd = open("file.txt", O_RDONLY );
if( fd == -1 )
{
perror("fail to open:");//perror 里面的只是一个提醒的字符串,自己定义
return 1; //非0表示失败
}
printf("%d\r",fd);
close函数
#include <unistd.h>
int close(int fd);
//打开了一个文件,记得关闭掉
测试一个进程最多能产生多少个文件描述符
文件描述符值的规律
write函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
write也可以向终端输出信息--stdout文件描述符为1
向一个文件写数据,count的值最好等于你写进去的字符,不然会出现问题,即使你大于你写进去的也会出现小问题
read函数
读数据需要注意的问题
情况1:读取的字符数大于最大一次读取字节数,那么只会读取最后一个字节,比如读取helloworld,读取为5,那么最后读取的是hello
情况2:读取的字符数小于最大一次读取字节数,那只会读取输入的数据加换行符,比如读取hell,读取是5,那么最后读取的是hell加换行符
lseek函数
文件IO函数的重点就是lseek,因为write和read操作的都是以读写指针(就存在偏移量了)开始,默认open一次,其读写指针在开头
情况:open一次,然后write一次,此时读写指针移动到最后,如果此时读取的话,那么就会失败,因为读写指针没有在开头.如果加lseek重新移动的话,那么就会成功
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
void Print_Error(int ret, const char *str )
{
if ( ret == -1 )
{
perror(str);
return 1;
}
else
{
printf("ret = %d\n",ret);
}
}
int main()
{
int fd;
ssize_t wret;
ssize_t rret;
char str[30];
fd = open("file.txt", O_RDWR | O_CREAT | O_TRUNC , 0664 );
Print_Error( fd, "fail to open" );
wret = write( fd, "hello world\n", 16 );
//lseek(fd, 0, SEEK_SET);
rret = read( fd, str, 20);
printf("rret = %d\n",rret);
printf("%s\n",str);
close(fd);
return 0;
}