i.MX6ULL 嵌入式学习(一)

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 -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) 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.hqwc.cn/news/466191.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红队打靶练习:DEVGURU: 1

目录 信息收集 1、arp 2、nmap 3、dirsearch WEB web信息收集 8585端口 漏洞利用 提权 系统信息收集 横向渗透 get flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:20:80:1b, IPv4: 192.168.10…

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点&#xff1a; 线程的缺点&#xff1a; 线程的用途&#xff1a; 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

python -m SimpleHTTPServer mac报错

错误内容&#xff1a; Traceback (most recent call last):File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main"__main__", fname, loader, pkg_name)File "/System/Libra…

Uniapp真机调试:手机端访问电脑端的后端接口解决

Uniapp真机调试&#xff1a;手机端访问电脑端的后端接口解决 1、前置操作 HBuilderX -> 运行 -> 运行到手机或模拟器 -> 运行到Android App基座 少了什么根据提示点击下载即可 使用数据线连接手机和电脑 手机端&#xff1a;打开开发者模式 -> USB调试打开手机端&…

前端面试题——JS实现反转链式表

前言 反转单向链表就是将整个单链表的数据进行倒序的过程。 例如&#xff0c;如果反转之前的单链表是0->1->2->3&#xff0c;那么反转之后的单链表应该是3->2->1->0。这个操作通常是通过改变链表中每个节点的指针方向来实现的&#xff0c;即让每个节点的指…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-中断管理

目录 一、中断基础概念二、中断管理使用说明三、中断管理模块接口四、代码分析&#xff08;待续...&#xff09; 一、中断基础概念 在程序运行过程中&#xff0c;出现需要由 CPU 立即处理的事务时&#xff0c;CPU 暂时中止当前程序的执行转而处理这个事务&#xff0c;这个过程…

KingSCADA实现按钮点击效果

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在做SCADA项目的时候&#xff0c;按钮是不可缺少的功能&#xff0c;但软件自带的按钮太丑&#xff0c;已经无法满足现如今客户对界面美观度的要求。 这时候就需要UI小姐姐设计美观大气的SCADA界面&#xff0c;但UI设计…

车载诊断协议DoIP系列 —— 协议中术语解释和定义

车载诊断协议DoIP系列 —— 协议中术语解释和定义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…

小周带你正确理解Prompt-engineering,RAG,fine-tuning工程化的地位和意义

有人会说&#xff1a;"小周&#xff0c;几天不见这么拉了&#xff0c;现在别说算法了&#xff0c;连code都不讲了&#xff0c;整上方法论了。" 我并没有拉&#xff01;而且方法论很重要&#xff0c;尤其工程化的时候&#xff0c;你总得知道每种技术到底适合干啥&…

政安晨:演绎在KerasCV中使用Stable Diffusion进行高性能图像生成

小伙伴们好&#xff0c;咱们今天演绎一个使用KerasCV的StableDiffusion模型生成新的图像的示例。 考虑计算机性能的因素&#xff0c;这次咱们在Colab上进行&#xff0c;Colab您可以理解为在线版的Jupyter Notebook&#xff0c;还不熟悉Jupyter的的小伙伴可以去看一下我以前的文…

Linux中FIFO管道

介绍&#xff1a; FIFO被称为命名管道&#xff0c;pipe只能用于有血缘关系的进程间通信&#xff0c;但通过FIFO&#xff0c;不相关的进程也可以进程间通信。 FIFO是linux基础文件类型的一种&#xff08;文件类型为p&#xff09;&#xff0c;FIFO文件在磁盘上没有数据块&#…

3秒实现无痛基于Stable Diffusion WebUI安装ComfyUI!无需重复安装环境!无需重复下载模型!安装教程

标题略有夸张哈哈哈哈&#xff0c;但想表达的是&#xff0c;相较于直接下载或者通过秋叶包更新而&#xff0c;接下来这一套方案确实很简单&#xff0c;而且能够 大大节省磁盘空间&#xff0c;和下载时间。 这篇教程不需要你有&#xff1a; 代码基础。都是复制粘贴就完事。魔法…