i.MX6ULL 嵌入式学习(一)

news2024/11/23 23:58:08

i.MX6ULL 嵌入式学习(一)

i.MX6ULL理论知识

  • i.MX6ULL 嵌入式学习(一)
    • 进程
    • ps
    • ipc 进程间通信
    • 管道
    • 信号(类似中断)
    • system-V 消息队列
    • system-V 信号量
    • system-V 共享内存

进程

  1. 创建进程(复制),同程序
    fork
    #include<unistd.h>
    a. 返回值

    成功 0 或 非负非零整数( 父进程返回正整数<pid 号>,子进程返回0)
    失败 -1
    fork 后 操作系统有两个 几乎一样的进程,fork 函数后的代码被执行两次

  2. 创建子进程,不同程序

    exec 函数族

    常用 后缀

    1. l: list 以列表形式 传参
    2. v: vector 以 向量形式传参
    3. p:使用环境变量 Path 来 寻找指定可执行文件
    4. e: 代表用户提供自定义环境变量

    注意: l和v 需要任选其一,p和e 可以任意组合

    且传参需要在后加NULL

  3. 退出

    #include<stdlib.h>

    exit(status) 处理文件缓存区

    _exit(status) 不处理文件缓存区

文件缓存区类似

int main()
{
        pid_t result;
        result = fork();
        if(result == -1)
                printf("fork error\r\n");
        if(result == 0)
        {
                printf("son");
                _exit(0);  // 不处理文件缓存区
        }
        else
        {
                printf("parent");
                exit(0); // 处理 文件缓存区
        }
}
// -------------------------------------------
打印输出 parent 而不输出 son

d. 等待进程

#include<sys/wait.h>

#include<sys/types.h>

wait(int *status)

出现语句后可以阻塞进程,并且 可以用WIFEXITED(status)WEXITSTATUS(status),查看 等待进程时的状态

pid_t result;
int status;
result = fork();

 if(result == -1)
         printf("error!!\r\n");
 if(result == 0)
 {
         printf("son\r\n");
         exit(0);
 }else
 {
         wait(&status); //堵塞 进程
         if(WIFEXITED(status) == 1)                  			
         printf("exit value:%d\r\n",WEXITSTATUS(status));
                return 0;
        }
/*
1. WIFEXITED(status) 若此值为非0 表明进程正常结束。
若上宏为真,此时可通过WEXITSTATUS(status)获取进程退出状态(exit时参数)
2.当一个子进程终止时,父进程可以通过wait()或waitpid()系统调用来等待并获取子进程的终止状态。终止状态包含了子进程的退出状态码和一些其他信息。
3. 要使用 WEXITSTATUS 宏,需要先获取到子进程的终止状态,并将该状态作为参数传递给WEXITSTATUS,然后它将返回子进程的退出状态码。
4. WEXITSTATUS 宏本身不会引起阻塞,阻塞可能发生在使用waitpid或wait函数时,等待子进程的退出。
*/

e. 写守护进程(不受终端影响)

  1. 创建一个子进程,父进程直接退出;fork()

  2. 创建一个新的会话,摆脱终端影响;setsid()

  3. 改变pwd为’/'; chrdir();

  4. 重设文件权限掩码(umask 进行查看)

    eg. 022 表示只写;真正的文件执行权限为:666&~umask; umask()

  5. 关闭 不需要的 文件描述符 0,1,2:标准输入 输出 出错; close();

  6. 不同进程伪装成守护进程 nohup

f. 僵尸进程 和 托孤进程

  1. 僵尸进程 : 子进程退出后,父进程没有调用wait()函数处理身后事,子进程变成僵尸进程。
  2. 父进程比子进程先退出,子进程变为孤儿进程,会自动把子进程挂在初始化进程上,来处理孤儿进程的身后事、

ps

ps选项 请添加图片描述

  • aux(关注进程本身)

VSZ 虚拟内存 RSS 物理内存 TTY 进程关联的终端 STAT 进程的状态请添加图片描述

START 启动时间

TIME 运行时间

COMMAND 执行的命令

  • axjf(进程的相互关系)

    PPID 进程的父进程ID

    PGID 进程所在进程组的ID

    TPGID 值为-1,表示进程为守护进程

    UID 用户ID

    COMMAND 以ASCII码显示层次关系。

ipc 进程间通信

  1. 管道、信号、FIFO
  2. System-V ipc
    1. 消息队列
    2. 信号量
    3. 共享内存
  3. socket ipc (BSD) 支持不同设备间通信
  4. posix ipc(IEEE)
    1. 消息队列
    2. 信号量
    3. 共享内存

管道

  1. 无名管道

    int pipe(int pipefd[2]);

    返回值为0(成功),-1(失败)

    1. 无法open,但是可以close
    2. 只能通过子进程继承文件描述符的形式来使用
    3. write 和 read 都会阻塞进程
    4. 所有文件描述符被关闭后,无名管道被销毁
  2. 有名管道

    int mkfifo(const char* file_name,mode_t mode) mode 是权限

    #include<sys/types.h>

    #include<sys/state.h>

    ps. write 具有原子性,整体写入,不能只写入一部分前提是内部内存是足够的

信号(类似中断)

  1. kill -l 可以 查看 所有的常见类型

    [learn@192 imx6ull_info]$ kill -l
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
     6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
    11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
    16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
    21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
    26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
    31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
    38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
    43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
    48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
    53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
    58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
    63) SIGRTMAX-1	64) SIGRTMAX	
    # 1-31 信号 为常用
    
    
  2. 产生信号

    1. 硬件 : 执行非法的指令; 访问非法的内存;驱动程序

    2. 软件:

      1. 控制台:Ctrl + C 中断信号、Ctrl + | 推出信号、Ctrl + Z 停止信号

        [learn@192 imx6ull_info]$ sleep 1000
        ^\Quit (core dumped)
        # ctrl + | or abort() 退出并生成转储文件
        
      2. kill 命令

        kill -9 命令的PID号 root 权限下,且要用ps aux 提前获得PID 号

        pkill是根据命令的名字进行杀死进程的。

      3. 程序调用kill()函数

  3. 信号的处理方式

    ​ 忽略、捕获、默认

    处理函数(需要包含#include<signal.h>)

    1. sighandler_t signal(int signum,sighandler_t handler);

      handler: SIG_IGN 忽略、SIG_DFL 默认、自定义

    2. kill 给自己发送信号

    3. raise 给别人发送信号

    过程1. signal 发送信号 2. 子进程等待信号3.父进程杀死信号4.父进程推出信号。

  4. 信号集处理函数

    1. 信号集

      1. 屏蔽信号集(自动 or 手动?)

      2. 未处理信号集(可以挂载屏蔽信号集)

        (1-33) 非实时信号集 等到最后一个操作完成后再做出反应

        (34-64) 试试信号集 排队执行 保留全部操作

    2. 处理函数

      请添加图片描述

system-V 消息队列

  1. 特点

    独立于进程、没有文件名和文件描述符、IPC对象具有key和ID

  2. 消息队列的用法
    1. 定义一个唯一的key(ftok(char* path,int proj_id))path 是个合法路径、proj_id是个整数
    2. 获取消息队列的ID(int msgget(key_t key, int msgflg))msgflg:IPC_CREAT如果消息队列不存在则创建;mode设置消息队列的读写访问权限
    3. 发送信息到信息队列(int msgsnd(int msqid,const void *msgp,size_t msgsz, int msgflg))msgp 消息队列缓存区包括消息标识和消息内容,msgsz消息正文的字节数,msgflg:IPC_NOWAIT:非阻塞发送,0:阻塞发送

个人理解有点类似与

FPGA里的:=和<=差不多,阻塞赋值和非阻塞赋值

  1. 从消息队列读取消息

    size_t msgrcv(int msgid, void *msgp,size_t msgsz,long msgtyp,int msgflg)

    msgtyp 要接受消息的标识,msgflg:IPC_NOWAIT 非阻塞读取,MSG_NOERROR 截断消息,0表示阻塞读取

  2. 删除消息队列(msgctl也可以改变消息队列的属性)

system-V 信号量

信号量类似于“计数器”,作用是保护共享资源{互斥访问、同步访问},互斥访问 说明资源的唯一性,同步访问 说明资源的顺序性

  1. 函数 semget 构造信号量

  2. 函数 semctl(int semid,int semnum,int cmd, union semun arg) 初始化信号量,或 删除信号量

    cmd :IPC_STAT 获取信号量的属性信息

    ​ IPC_SET 设置信号量的属性

    ​ IPC_RMID 删除信号量

    ​ IPC_SETVAL 设置信号量的值

    union semun 共用体可以固定信息的传参

  3. 函数 semop(int semid,struct sembuf *sops, size_t nsops)

    struct sembuf 
    {
    	short sem_num; // 信号量编号
        short sem_op; // 信号量 P/V 操作
        short sem_flg; // 信号量行为 SEMUNDO 如果未释放,可以自动释放
    }
    // op = 1 执行 V 操作
    
  4. 父子进程的执行顺序是随机的,不过由信号量的机制就可以使得子进程在父进程之前运行。

system-V 共享内存

步骤

  1. 定义一个唯一的key,ftok
  2. 构造共享内存对象shmget
  3. 共享内存映射shmat
  4. 解除共享内存映射shmdt
  5. 删除共享内存
     short sem_op; // 信号量 P/V 操作
          short sem_flg; // 信号量行为 SEMUNDO 如果未释放,可以自动释放
      }
      // op = 1 执行 V 操作
  1. 父子进程的执行顺序是随机的,不过由信号量的机制就可以使得子进程在父进程之前运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1445754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FL Studio版本升级-FL Studio怎么升级-FL Studio升级方案

已经是新年2024年了&#xff0c;但是但是依然有很多朋友还在用FL Studio12又或者FL Studio20&#xff0c;今天这篇文章教大家如何升级FL Studio21 FL Studio 21是Image Line公司开发的音乐编曲软件&#xff0c;除了软件以外&#xff0c;我们还提供了FL Studio的升级服务&#…

【C语言】assert断言:保护程序的利器

在软件开发过程中&#xff0c;我们经常会遇到一些假设条件或者预期行为。例如&#xff0c;我们可能假设一个函数的输入参数必须在某个范围内&#xff0c;或者某个变量的值应该满足特定的条件。当这些假设或预期行为被打破时&#xff0c;程序可能会出现异常行为&#xff0c;甚至…

轻薄型机型EM-T195,对移动作业so easy

由于移动工作环境特殊且不固定&#xff0c;不仅温差大&#xff0c;还会产生潮湿、干燥、灰尘等恶劣气候环境&#xff0c;使普通平板电脑无法适应移动工作。但三防平板电脑是设计制造的&#xff0c;材料特殊&#xff0c;可以平静面对上述恶劣环境&#xff0c;保证随时随地保持良…

备战蓝桥杯---数学基础3

本专题主要围绕同余来讲&#xff1a; 下面介绍一下基本概念与定理&#xff1a; 下面给出解这方程的一个例子&#xff1a; 下面是用代码实现扩展欧几里得算法&#xff1a; #include<bits/stdc.h> using namespace std; int gcd(int a,int b,int &x,int &y){if(b…

C++三剑客之std::optional(一) : 使用详解

相关文章系列 C三剑客之std::optional(一) : 使用详解 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 目录 1.概述 2.构建方式 2.1.默认构造 2.2.移动构造 2.3.拷贝构…

【深度学习:迁移学习】图像识别预训练模型的迁移学习

【深度学习&#xff1a;迁移学习】图像识别预训练模型的迁移学习 什么是迁移学习&#xff1f;为什么不从头开始训练模型&#xff1f;迁移学习的优点是&#xff1a;如何使用预训练模型进行迁移学习&#xff1a;迁移学习的过程&#xff1a;实施迁移学习来构建人脸识别模型&#x…

tcp 中使用的定时器

定时器的使用场景主要有两种。 &#xff08;1&#xff09;周期性任务 这是定时器最常用的一种场景&#xff0c;比如 tcp 中的 keepalive 定时器&#xff0c;起到 tcp 连接的两端保活的作用&#xff0c;周期性发送数据包&#xff0c;如果对端回复报文&#xff0c;说明对端还活着…

【GAMES101】Lecture 22 物理模拟与仿真

目录 单粒子模拟 显式欧拉方法 改进 中点法/修正的欧拉方法 自适应步长 隐式欧拉方法 非物理改变位置&#xff08;Position-Based / Verlet Integration&#xff09; 刚体模拟 流体模拟 单粒子模拟 先来研究粒子的运动&#xff0c;假设有一个速度矢量场&#xff0c;对…

记录一下,我使用stm32实现pwm波输入,以及对频率和占空比的计算,同时通过串口输出(实现-重要)

1&#xff0c;首先看下半物理仿真 看下我的配置&#xff1a; 看下计算方法以及matlab的仿真输出的数据&#xff1a; timer3的ch2是选择高电平&#xff0c;计算频率 timer3的ch1是选择的是低电平&#xff0c;用来计算周期 其中TemPIpre表示的是CH2输出的值&#xff0c; TemPI…

牛客周赛 Round 32 解题报告 | 珂学家 | 状压 + 前缀和异或map技巧

前言 整体评价 属于补题&#xff0c;大致看了下&#xff0c;题都很典。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的 01 背包 思路: 数学题 v, x, y list(map(int, input().split()))print (v // x * y)B. 小红的 dfs 思路: 枚举 其实横竖都有dfs…

网络协议与攻击模拟_16HTTP协议

1、HTTP协议结构 2、在Windows server去搭建web扫描器 3、分析HTTP协议流量 一、HTTP协议 1、概念 HTTP&#xff08;超文本传输协议&#xff09;用于在万维网服务器上传输超文本&#xff08;HTML&#xff09;到本地浏览器的传输协议 基于TCP/IP(HTML文件、图片、查询结构等&…

Windows Anaconda 运行 gempy examples。示例::

默认读者已安装&#xff1a;Anaconda. 若未安装请参考以下文章&#xff1a; Windows中如何使用 Anaconda 和 gempy地质建模 1&#xff0c;打开Anaconda Navigator: 打开后如此&#xff1a; 运行JupyterLab: launch。 打开gempy example 建模示例&#xff1a; 官方地址&#x…

Linux diff命令

参考资料 【 diff 】コマンド&#xff08;基本編&#xff09;――テキストファイルの差分を出力する便利なdiffコマンド使い方 目录 前期准备一. 基本语法二. 文件比较2.1 无配置项2.2 -B 忽略空行&#xff0c;-w忽略空格2.3 -y 文件内容横向比较显示2.4 -q 仅显示文件是否不同…

AlmaLinux右键菜单(基于GNOME桌面)

文章目录 前言前提说明在文件上右键在文件夹上右键 前言 在使用VSCode的过程中&#xff0c;AlmaLinux没能像Windows一样在右键菜单上显示打开方式&#xff0c;所以找了一下解决方案&#xff0c;罗列出来 前提说明 虽然说无论是media还是StackOverflow都推荐使用这条命令&…

2024年华为OD机试真题-多段线数据压缩-Java-OD统一考试(C卷)

题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3, 7), (3, 6), (3, 5), (4, 4), (5, 3), (6, 2), (7, 3), (8, 4), (7, 5)。 但可以发现,这…

Stable Diffusion 模型下载:majicMIX lux 麦橘辉耀 - V3

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

王树森《RNN Transformer》系列公开课

本课程主要介绍NLP相关&#xff0c;包括RNN、LSTM、Attention、Transformer、BERT等模型&#xff0c;以及情感识别、文本生成、机器翻译等应用 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) &#xff08;一&#xff09;NLP基础 1、数据处理基础 数…

【DDD】学习笔记-统一语言与领域分析模型

无论你采用什么样的软件开发过程&#xff0c;对于一个复杂的软件系统&#xff0c;都必然需要通过分析阶段对问题域展开分析&#xff0c;如此才能有的放矢地针对该软件系统的需求寻找设计上的解决方案。在领域驱动设计中&#xff0c;分析阶段完全围绕着“领域”为中心展开&#…

RabbitMQ(保姆级教程)

RabbitMQ学习 基础 1. 同步通信和异步通信 同步调用 下一步动作必须依赖上一步 异步调用 通知到位就行&#xff0c;不对消费者做强制要求&#xff0c;只要求最终一致性就行 2. MQ技术选项 消息先进先出&#xff0c;RabbitMQ默认有序 Erlang 是面向并发&#xff0c…

STM32 + ESP8266,连接阿里云 上报/订阅数据

&#xff08;文章正在编辑中&#xff0c;一点点地截图操作过程&#xff0c;估计要拖拉两三天&#xff09; 一、烧录MQTT固件 ESP8266出厂时&#xff0c;默认是AT固件。连接阿里云&#xff0c;需要使用MQTT固件。 1、独立EPS8266模块的烧录方法 2、魔女开发板&#xff0c;板载…