千锋教育嵌入式物联网教程之系统编程篇学习-01

本文介绍了系统编程的基础,包括如何通过系统调用操作内核,如使用open、close、write、read等函数进行文件操作。强调了文件描述符的概念和IO函数的使用,以及错误处理的方法,如通过perror显示错误信息。此外,还提到了lseek函数在文件定位中的作用和remove函数用于删除文件。
摘要由CSDN通过智能技术生成

目录

 课程视频链接

 笔记目的

什么是系统编程

 如何操作内核的系统调用

 系统调用的分类​编辑

 系统调用的返回值

 系统调用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;
}

 remove函数 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值