嵌入式linux编程基础知识框架介绍

以下内容是介绍了一些嵌入式linux编程所涵盖的知识点,归纳了C语言,系统编程,网络编程,shell编程以及sqlite3数据等知识点。
有些知识点可能没有归纳到,具体详细的知识点内容需要逐步学习。

一:Linux C语言

1. 基本要素

1. 标识符的命名规范?
2. 4 个命名空间?
3. 缩进
4. 空格和空行
5. 括号
6. 注释

2. 基本数据类型

1. 布尔类型数据
    (1) 布尔常量
    (2) 布尔变量
2. 整型数据
    (1) 八种类型的整型
    (2) 八种整型的最值范围
    (3) 内存溢出
    (4) 可移植性数据类型
    (5) 系统基本数据类型
    (6) 计算机的存储方式
        <1>大小端序的理解
3. 浮点型数据
    (1) 浮点型数据的取值范围
    (2) 浮点型的类型
    (3) 浮点型的编码三种情形

3. 运算符

1. 算术运算符
    (1) 7 个运算符
2. 关系运算符
    (1) 6 个关系运算符
3. 逻辑运算符
    (1) 3 个逻辑运算符
4. 位运算符
    (1) 6 个位运算符
5. 特殊运算符
    (1) 赋值、复合赋值、条件、sizeof、逗号、return运算符
6. 运算符的优先级和结合性

4. 控制流

1. 循环控制
    (1) while()
    (2) do...while();
    (3) for 循环
2. 分支控制
    (1) 两路分支 if else 
    (2) 多路分支 if else if、switch case
    (3) 直接跳转 goto loop; loop:

5. 函数

1. 函数认识
    (1) 函数头
    (2) 函数细节封装的好处
    (3) 函数使用中的3个主要部分
2. 函数调用
    (1) 栈内存
3. 递归思维及其实现
4. 变参函数
5. 回调函数
6. 内联函数

6. 数组与指针

1. 数组初阶
2. 内存地址
3. 指针初阶
4. 复杂指针定义
    (1) 指向指针的指针,指向数组的指针,指向函数的指针
5. 指针运算
    (1) 定义指针
    (2) 指针赋值
    (3) 指针取址
    (4) 指针的解引用
    (5) 指针的加减法
6. 数组和指针的关联
    (1) 与指针混合运算
    (2) 与下标运算符相互作用
    (3) 函数调用
7. 复杂数组剖析
    (1) 零长数组(柔性数组):linux GNU的扩展数组
8. const 指针
9. char 指针和 char 数组

7. 内存管理

1. 栈内存
2. 堆内存
3. 数据段
    (1) .bss,.data,.rodata数据段
4. 代码段
    (1) .text,.init段
5. 堆

8. 组合数据类型

1. 结构体
    (1) 结构体的大小
2. 共用体(联合体)
3. 枚举类型

9. 高级议题

1. 工程代码组织
2. 头文件
3. 宏
4. 条件编译
5. 复杂声明
6. attribute机制

二:系统编程

1:进程入门

1. 进程概念
          1进程控制块(PCB):task_struct{}; :存放进程信息的结构体
2. 进程组织方式
        (1)父进程与子进程关系
        (2)pstree查看整个系统的进程关系
        (3)ps查看进程的PID号
        (4)祖先进程init

2:进程的状态

1. 进程状态(状态特性?)
        (1)就绪态    :TASK_RUNNING
        (2)执行态 :TASK_RUNING
        (3)暂停态 :TASK_STOPPED、TASK_TRACED
        (4)睡眠态 :TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE
        (5)僵尸态 :EXIT_ZOMBIE
        (6)死亡态 :EXIT_DEAD
        
2. 进程状态的切换(如何切换?)
        (1)进程的诞生fork()--->就绪态   :创建进程
        (2)就绪态--->执行态   
        (3)执行态--->睡眠态   
        (4)执行态--->暂停态  
        (5)执行态--->就绪态  
        (6)执行态--->僵尸态                       
        (7)暂停态--->就绪态  
        (9)僵尸态--->死亡态 
        
3. 进程的API接口(如何使用?)
        (1)创建新进程 :fork();(fork后的属性异同?)                      
        (2)在进程中加载新的程序文件或脚本,覆盖原源码,重新运行:  exec()函数簇(共6个);
        (3)退出进程:exit()、_exit();
        (4)等待子进程退出: wait()、waitpid();

3:进程间的通信

1. 管道
    (1)无名管道PIPE
            《1》创建无名管道:pipe()
            《2》无名管道特征               
    (2)有名管道FIFO
            《1》创建有名管道:mkfifo()
            《2》有名管道特征
2. 信号
    (1)非实时信号特点
    (2)实时信号特点
    (3)信号的值、默认响应动作以及产生的原因
    (4)信号API接口:
            《1》发送信号:kill();
            《2》捕捉信号:signal();
            《3》对自己发送信号:raise();
            《4》将本进程挂起,等待信号:pause();
            《5》信号集操作函数簇:
                    <1>清空信号集  :sigemptyset();
                    <2>将所有信号添加到信号集中  :sigfillset();
                    <3>将指定的一个信号添加到信号集中  :sigaddset();
                    <4>将指定的一个信号从信号集中剔除  :sigdelset();
                    <5>判断一个信号是否存在于信号集中。:sigismember();
            《6》阻塞或解除阻塞一个或多个信号:sigprocmask();
            《7》发送信号,同时可携带数据发送 :sigqueue();
            《8》捕捉信号,同时可获取额外数据 :sigaction();
    (5)信号相关的内核数据结构
    (6)信号安全
            《1》信号安全函数
            
3. IPC通信对象
    (1)IPC对象的键值key的创建:ftok();
    (2)IPC对象的linux操作命令:
                《1》查看消息队列:ipcs -q、查看共享内存:ipcs -m、查看信号量:ipcs -s、查看所有的IPC对象:ipcs -a
                《2》删除指定的消息队列:ipcrm -q MSG_ID 或 ipcrm -Q msg_key
                《3》删除指定的共享内存:ipcrm -m SHM_ID 或ipcrm -M shm_key
                《4》删除指定的信号量:ipcrm -s SEM_ID 或 ipcrm -S sem_key
    (3)消息队列
                《1》获取消息队列的ID :msgget();
                《2》发送消息:msgsnd();
                《3》接收消息:msgrcv();
                《4》设置或获取消息队列的相关属性:msgctl();
                
    (4)共享内存
                《1》获取共享内存ID :获取共享内存的ID :shmget();
                《2》映射共享内存 :shmat();
                《3》解除共享内存映射:shmdt();
                《4》获取或设置共享内存的相关属性 :shmctl();
    (5)信号量
                《1》获取信号量ID :semget();
                《2》信号量的P/V操作 : semop();
                《3》获取或设置信号量的相关属性: semctl();

4:线程入门

1. 线程基本概念

2. 线程API 接口
    (1)创建线程 :pthread_create();
    (2)设置线程的分离属性 :pthread_attr_setdetachstate();
    (3)获取线程的分离属性 :pthread_attr_getdetachstate();
    (4)设置线程的调度策略 :pthread_attr_setschedpolicy();
    (5)获取线程的调度策略 :pthread_attr_getschedpolicy();
    (6)设置线程是否继承创建者的调度策略 :pthread_attr_setinheritsched();
    (7)获取线程是否继承创建者的调度策略 :pthread_attr_getinheritsched();
    (8)设置线程静态优先级 :pthread_attr_setschedparam();
    (9)获取线程静态优先级 :pthread_attr_getschedparam();
    (10)设置线程栈大小 :pthread_attr_setstacksize();
    (11)获取线程栈大小 :pthread_attr_getstacksize();
    (12)设置线程警戒区大小 :pthread_attr_setguardsize();
    (13)获取线程警戒区大小 :pthread_attr_getguardsize();
    (14)线程的退出 :pthread_exit();
    (15)接合指定线程 :pthread_join();   如线程还在运行则阻塞等待
    (16)接合指定线程 :pthread_tryjoin_np(); 如线程还在运行立即出错返回
    (17)线程的取消 :pthread_cancel();
    (18)设置线程的取消状态 :pthread_setcancelstate();
    (19)设置线程的取消类型 :pthread_setcanceltype();
    (20)压栈线程的取消处理例程 :pthread_cleanup_push();
    (21)弹栈线程的取消处理例程 :pthread_cleanup_pop();

5:线程安全

1. POSIX信号量
    (1)POSIX 有名信号量 
                《1》创建、打开一个有名信号量 : sem_open();
                《2》有名信号量的P/V操作 :
                            <1> P操作 :sem_wait();
                            <2> V操作 :sem_post();
                《3》关闭有名信号量 :sem_close();
                《4》删除有名信号量 :sem_unlink();
    (2)POSIX 无名信号量(一般用于线程之间)
                《1》初始化无名信号量 :sem_init();
                《2》销毁无名信号量 :sem_destroy();
                
                
2. system-V 信号量(消息队列、共享内存、信号量)与POSIX信号量(有名信号量、无名信号量)的区别

3. 互斥锁和读写锁
    (1)互斥锁
            《1》上锁 :pthread_mutex_lock();
            《2》解锁 :pthread_mutex_unlock();
            《3》销毁互斥锁 :pthread_mutex_destroy();
    (2)读写锁 
            《1》加写锁 :pthread_rwlock_wrlock();
            《2》加读锁 :pthread_rwlock_rdlock();
            《3》解读写锁 :pthread_rwlock_unlock();
            《4》销毁读写锁 :pthread_rwlock_destroy();

4. 条件变量
    (1)初始化条件变量 :pthread_cond_init();
    (2)销毁条件变量 :pthread_cond_destroy();
    (3)进入条件变量等待队列同时对获取配套的互斥锁
            《1》pthread_cond_timedwait();    //可以设置超时时间
            《2》pthread_cond_wait();
    (4)唤醒全部条件变量等待队列中的进程 :pthread_cond_broadcast();
    (5)唤醒单个条件变量等待队列中的进程 :pthread_cond_signal();
    
5. 可重入函数
    (1)可重入函数 :同时被多条线程调用,返回值始终严格一致。
    (2)不可重入函数 :同时被多条线程调用,返回结果不一致。
    (3)多线程同时调用不可重入函数可能产生不一致的结果的原因有哪些?

6: 线程池

1. 线程池实现原理?

2. 线程池相关结构体 
       《1》任务节点结构体 :struct task{};
       《2》线程池实例结构体 :thread_pool{};
3. 创建(初始化)线程池 :init_pool();
4. 往线程池投送任务 :add_task();
5. 增加线程池活跃线程 :add_thread();
6. 删除线程池活跃线程 :remove_thread();
7. 销毁线程池 : destroy_pool();

三.文件IO操作

1:一切皆文件

1. 文件的概念

2. 各类文件 (各自特点是?)
        《1》普通文件 :   -(regular)
        《2》目录文件 :     d(directory)
        《3》管道文件 :     p(pipe)
        《4》套接字文件 : s(socket)
        《5》链接文件 : l(link)
        《6》字符设备文件:c(character)
        《7》块设备文件 : b(block)

2:文件操作

1. 系统I/O
        《1》打开文件并获得文件描述符或创建一个新文件: open();
                <1>  0、1、2 (标准输入、标准输出、标准出错)
                <2> 文件描述符的概念
                <3> 进程控制块task_struct{}与files_struct{}的关系
        《2》关闭文件并释放资源 :close();
        《3》从指定文件中读取数据 : read();
        《4》将数据写入到指定文件 : write();
        《5》调整文件位置偏移量 : lseek();
        《6》复制文件描述符:
                <1> dup(); 复制已有文件描述符。
                <2> dup2(); 复制一个文件描述符到指定文件描述符
        《7》文件控制
                <1> ioctl();
                <2> fcntl();
        《8》内存映射 mmap();
2. 标准I/O
        《1》获得指定文件的文件指针  :fopen();
        《2》关闭指定的文件并释放资源  :fclose();
        《3》获取指定文件的一个字符 :
                <1>fgetc()      :函数
                <2>getc()       :宏定义
                <3>getchar()    : 默认从标准输入设备读取一个字符。
        《4》将一个字符写入一个指定文件中 :
                <1>fputc()      :函数
                <2>putc()       :宏定义    
                <3>putchar()    :默认从标准输出设备输出一个字符。
        
        《5》判断一个文件是否到达文件末尾 :feof();
        《6》判断一个文件是否遇到了某种错误 ferror();
        《7》从指定文件读取最多一行数据
                <1> fgets();
                <2> gets();
        《8》将数据写入指定的文件
                <1> fputs();
                <2> puts();
        《9》从指定文件读取若干个数据块 :fread();
        《10》将若干块数据写入指定文件 : fwrite();
        《11》设置指定文件的当前位置偏移量 : fseek();
        《12》获取指定文件的当前位置偏移量 :ftell();
        《13》将指定文件的当前位置偏移量设置到文件开头处 rewind();
        《14》将格式化数据写入指定的文件或者内存
                <1> fprintf();
                <2>printf();
                <3>snprintf();
                <4>sprintf();
                <5>以上四个的区别?
        《15》从指定的文件或者内存中读取格式化数据
                <1>fscanf();
                <2>scanf();
                <3>sscanf();
                <5>以上三个的区别?
        《16》格式化I/O函数的格式控制符的理解?
        
3. 文件属性
        《1》获取文件的元数据
                <1>stat();
                <2>fstat();
                <3>lstat();
                <4>以上三种的区别?
        《2》文件设备号:分离主次设备号函数接口
                <1> major();
                <2> minor();
        《3》文件类型和权限
                <1>st_mode的各个位域细节
                <2>判断文件类型的宏?

3:目录检索

1. 目录和文件夹的区别?
2. 目录 API
        《1》打开目录以获得目录指针 : opendir();
        《2》读取目录项 : readdir();

四:网络编程

1. IOS网络分层

1. OSI网络分层结构
    (1) 7 层模型?
    (2) 7 层模型的了解? *
    
2. OSI 参考模型中的数据传输
    (1) 两主机之间的传输过程步骤?
    (2) 主机之间的传输过程了解?*

2. TCP/IP协议

1. TCP/IP协议栈
    (1)TCP/IP参考模型从上往下分为哪4个层次?
    (2) 4 个层次的实现的功能?*
    (3) OSI七层参考模型与TCP/IP四层参考模型的对比区分?
    (4)IP协议?
    (5) ipv4与ipv6的区别?
    
2. 传输控制协议(TCP)
    (1) TCP协议与IP协议的关系?
    (2) TCP协议的特点?*
    (3) 端口号?
    (4) 三次握手与四次握手?
    (5) TCP的封装,解封过程?
    
3. 用户数据报文协议(UDP)
    (1) UDP协议与TCP/IP的关系?
    (2) UDP的特点(或与TCP的区别)?
    (3) UDP数据的传输过程?
    
4. 地址解析协议(ARP)
    (1) ARP的作用?
    (2) DNS域名解析?

3. IP地址分类与TCP/UDP端口

1. IP地址的分类
    (1) IP地址的格式?
    (2) IP地址的分类?
    (3) IP地址各类的特点?
    (4) IP地址的分类开始字段值?
    (5) 因特网规定的一些特殊地址?

4. 主机字节序和网络字节序

    (1) 小端字节序?
    (2) 大端字节序?
    (3) IP地址转换的接口函数?
    (4) 端口的转换接口函数?
    (5) 网络转主机的接口函数?

5. 套接字编程

    (1) 通用套接字数据结构体?
    (2) struct sockaddr_in{}结构体?
    (3) 结构体sockaddr和sockaddr_in的关系?

6.TCP 网络编程

    (1) 客户端接口函数:
            <1> socket()创建套接字
            <2> connect()连接
            <3> write()/send()写入
            <4> read()/recv() 读取
            <5> close()关闭
    (2) 服务端接口函数:
            <1> socket()创建套接字
            <2> bind() 绑定端口号
            <3> listen()监听数据
            <4> accept()接收数据
            <5> read()/recv()读取
            <6> write()/send()写入发送
            <7> close() 结束
    (3) TCP 的广播 ?
    (4) TCP 的组播 ?
    (5) TCP 的点播 ?

7. UDP 网络编程

    (1) 客户端接口函数:
            <1> socket()创建套接字
            <2> sendto() 发送数据
            <3> recvfrom() 接收数据
            <4> close() 关闭数据
    (2) 服务端接口函数:
            <1> socket() 创建套接字
            <2> bind() 绑定端口号
            <3> recvfrom() 接收数据
            <4> sendto()发送数据
    (3) UDP 的广播 ?
    (4) UDP 的组播 ?
    (5) UDP 的点播 ?
  1. TCP,UDP 的对比
    (1) TCP的广播,组播,点播流程?
    (2) UDP 的点播,组播,点播流程?
    (3) TCP通信和UDP通信的对比?
  2. 多路复用
    (1) 多路复用的特点?
    (2) select()的使用?
    (3) poll()的使用?
    (4) select()与poll()的使用区别?

五:shell编程

  1. shell脚本的基本语法
    (1) 三大变量?
    (2) 常用$符号?
    (3) $符号的部分功能?

  2. shell脚本中的特殊符号
    (1) 常用的6个特殊符号?

  3. shell中的运算符号
    (1) +,-,*,/
    (2) 用法

  4. shell中的输入输出
    (1) read 输入
    (2) echo 输出

  5. shell中if 语句判断
    (1) if的两种写法?
    (2) if的三种情况?
    (3) if的注意点?

  6. shell 中的while循环
    (1) while循环的写法?
    (2) until循环的写法?

  7. shell中的选择条件分支
    (1) case 语句的写法?

  8. shell编程函数
    (1) 函数的定义?
    (2) 函数的调用?
    (3) 函数的传参?

  9. 正则表达式
    (1) 含义?
    (2) 常用的元字符?

  10. awk语句(控制表格列的输出)
    (1) 打印指定列 ?
    (2) 格式化输出 ?
    (3) 过滤排除 ?
    (4) 打印表头,引入内建变量?
    (5) 内建变量 ?
    (6) 指定分隔符?
    (7) 使用正则表达式匹配字符串?
    (8) 模式取反?
    (9) 拆分文件 ?
    (10) 统计数据?

  11. sed语句(控制表格行的输出)
    (1) 替换?
    (2) 指定某些行替换 ?
    (3) 直接通过sed修改原文?
    (4) 替换每一行中指定的数据?
    (5) 多个匹配?
    (6) 将指定的行删除?
    (7) 打印指定的行?
    (8) 使用相对位置打印?
    (9) 执行多个命令?

六: sqlite3 数据库

  1. 移植
    (1) 移植的三大步骤 ?
    (2) 移植sqlite

  2. 常用命令
    (1) 退出sqlite
    (2) 列举表格名字
    (3) 创建表格的两种方法?
    (4) 往表格插入数据
    <1>有unique修饰符?
    <2>无unique修饰符? •
    (5) 查询数据
    <1> 单个条件查询?
    <2> 多个条件查询?
    <3> 升序查询?
    <4> 模糊匹配查询?
    (6) 删除数据?
    (7) 修改,更新数据?
    (8) 删除表?

  3. sqlite 中的12种数据类型?

  4. sqlite提供的接口函数?
    (1) sqlite3_open():打开数据库文件?
    (2) sqilte3_exec():执行数据库操作命令?
    (3) sqlite3_close():关闭数据库?

发布了9 篇原创文章 · 获赞 10 · 访问量 276

猜你喜欢

转载自blog.csdn.net/my___sunshine/article/details/104004527