嵌入式学习 Day 24

news2024/9/30 13:17:39

1.exec函数族


    extern char **environ;

    int execl(const char *path, const char *arg, ...
                    /* (char  *) NULL */);
    int execlp(const char *file, const char *arg, ...
                    /* (char  *) NULL */);
    int execle(const char *path, const char *arg, ...
                    /*, (char *) NULL, char * const envp[] */);
    int execv(const char *path, char *const argv[]);
    int execvp(const char *file, char *const argv[]);
    int execvpe(const char *file, char *const argv[],
                    char *const envp[]);

    功能:
        利用进程空间执行另外一份代码
    
    l:参数以列表形式传递
    v:参数以指针数组形式传递
    e:更新环境变量
    p:在系统指定目录下查找文件

 注意:

execl 默认在当前目录下寻找

或者

execlp默认在系统目录下寻找

更改路路径到当前目录

或者

    getenv
    char *getenv(const char *name);
    功能:
        获得环境变量名对应的值
    
    setenv
    int setenv(const char *name, const char *value, int overwrite);
    功能:
        设置环境变量的值
    参数:
        name:环境变量名
        value:环境变量的值
        overwrite:非0 覆盖
                  0   不覆盖
    返回值:
        成功返回0 
        失败返回-1 
       

 

2.线程:


    1.基本概念:

        线程:线程是一个轻量级的进程,位于进程空间内部,一个进程中可以创建多个线程

    2.线程创建:

        线程独占一个栈空间, 文本段、数据段和堆区与进程共享


    3.线程调度:

        与进程调度是一样的
        宏观并行,微观串行 


    4.线程消亡:

        与进程消亡是一样的

    5.进程和线程的区别:

        进程是操作系统资源分配的最小单元
        线程是CPU任务调度的最小单元

 

    6.函数和线程的区别:

       被调函数执行完后主函数才继续向下执行

       线程在被创建后和进程同时向下执行

    7.多进程和多线程的优缺点:


        效率 : 多线程 > 多进程 

             多线程只需在同一进程空间内切换
             多进程需要在不同的空间中切换        


        通信 : 多线程 > 有进程

            线程共享全局变量,可以通过全局变量实现数据通信
            进程空间是独立的,没有共享空间,通信实现比较复杂

        通信实现 : 多进程 > 多线程

            线程共享空间操作时会引发资源竞争(通过使用时上锁,使用后解锁来解决)
            进程没有共享空间,不存在资源竞争的问题      


        安全 : 多进程 > 多线程

            一个进程异常不会影响其余进程空间
            一个线程异常结束会导致进程异常结束,进程异常结束,该进程内所有线程任务均无法向下执行    


    8.线程相关的函数接口:

        创建: fork      pthread_create 
        退出: exit      pthread_exit 
        回收: wait      pthread_join 

        1.pthread_create


          int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
          功能:
            在该进程中创建一个新的线程
          参数:
            thread:存放线程ID空间首地址
            attr:线程属性空间首地址
            start_routine:线程要执行的函数的入口
            arg:给线程函数的参数
          返回值:
            成功返回0 
            失败返回错误码

        编译时加 -lpthread选项  

        2.pthread_self


          pthread_t pthread_self(void);
          功能:
            获得调用该函数线程的ID      

        3.pthread_exit 


          void pthread_exit(void *retval);
          功能:
            让调用该函数的线程任务结束
          参数:
            retval:线程结束的值


        4.pthread_join 


          int pthread_join(pthread_t thread, void **retval);
          功能:
            回收线程空间
          参数:
            thread:线程的ID号
            retval:存放线程结束状态空间的首地址
          返回值:
            成功返回0 
            失败返回错误码

3.何时用到二级指针(题外话)

1.指针数组传参时,用到二级指针

   指针数组是一个包含多个指针元素的数组。每个指针元素可以指向不同的数据类型或数据结构。通过传递指针数组的地址(即指针数组的数组名),被调函数可以直接访问和修改数组中的元素。

#include <stdio.h>

// 函数原型,接受一个指针数组作为参数
void printPointers(int *ptrArr[], int size) 
{
    for (int i = 0; i < size; i++)
    {
        printf("%p\n", ptrArr[i]);
    }
}

int main()
{
    int num1 = 10;
    int num2 = 20;
    int num3 = 30;

    // 定义一个指针数组,包含三个整型指针
    int *ptrArr[] = {&num1, &num2, &num3};

    // 将指针数组传递给函数
    printPointers(ptrArr, 3);

    return 0;
}

定义了一个指针数组 ptrArr,其中包含三个整型指针,分别指向变量 num1num2num3。然后,我们将指针数组传递给 printPointers 函数,它会遍历指针数组并打印每个指针的地址。 

2.被调修改主调时,用到二级指针

    函数传参是值传递,形参只是实参的副本,形参值如何变化不影响实参的值

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

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

相关文章

插件废土课:打造属于你的“智能笔记”!

哎呀嘞&#xff0c;亲爱的网页冲浪者们&#xff0c;抓紧浮板&#xff0c;我们要继续在Chrome插件的海浪上翻滚啦&#xff01;上次我们玩了个小把戏&#xff0c;搞了个显示时间的Hello World插件&#xff0c;这次我们要把游戏玩大&#xff0c;准备打造一个能让你在网页上乱涂乱画…

【论文精读】LLaMA1

摘要 以往的LLM&#xff08;Large Languages Models&#xff09;研究都遵从一个假设&#xff0c;即更多的参数将导致更好的性能。但也发现&#xff0c;给定计算预算限制后&#xff0c;最佳性能的模型不是参数最大的&#xff0c;而是数据更多的。对于实际场景&#xff0c;首选的…

Qt QWidget 简约美观的加载动画 第二季

&#x1f603; 第二季来啦 &#x1f603; 简约的加载动画,用于网络查询等耗时操作时给用户的提示. 这是最终效果: 一共只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #i…

RabbitMq:RabbitMq消息中的相关处理 ③

一、解耦思想 在 RabbitMQ 在设计的时候&#xff0c;特意让生产者和消费者分离&#xff0c;也就是消息的发布和消息的消费之间是解耦的。 生产者与消费者之间的直连&#xff0c;少了很多的灵活性和策略的制定。还有一种解耦的思想存在。 二、消息的可靠性保证与性能关系 消息的…

APP自动化第一步:Appium环境搭建

一、安装Appium Python client包 1.直接cmd窗口输入pip install Appium-Python-Client 2.要确保安装匹配版本的selenium和appium 使用命令pip install selenium -U 首先进入网盘下载这三个软件的压缩包 二、安装Appium Server 1.双击打开压缩包Appium 2.双击进行安装。 3.点…

卡玛网● 46. 携带研究材料 ● 01背包问题,你该了解这些! 滚动数组 力扣● 416. 分割等和子集

开始背包问题&#xff0c;掌握0-1背包和完全背包即可&#xff0c;注&#xff1a;0-1背包是完全背包的基础。 0-1背包问题&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求…

最短路径——通过Dynamo批量创建行进路线

今天我们来聊聊Revit2020新增的一个功能——布线分析&#xff0c;这个功能还是挺有意思的&#xff0c;只是需要”桌子“以后多开放点API就好了&#xff0c;今天我们就简单的试用一下这个功能。 打开Revit2020我们在分析选项卡下&#xff0c;最右侧可以找到布线分析功能栏&am…

JavaScript事件机制

JavaScript事件机制描述的是事件在DOM里面的传递顺序&#xff0c;以及可以对这些事件做出如何的响应。 DOM事件流存在三个阶段&#xff1a; ①事件捕获阶段(从window对象传导到目标节点)、 ②处于目标阶段(在目标节点上触发)、 ③事件冒泡阶段(从目标节点传导回window对象)。 在…

JVM虚拟机初步了解

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展&#xff0c;在这个系列专栏中记录了博主在学习期间总结的大块知识点&#xff1b;以及日常工作中遇到的各种技术点 ┗|&#xff40;O′|┛ &#x1f306; 题目速览 1. JVM的位置2. JVM的体系结构3…

python(ch2)

可变长编码和不可变长编码 可变长编码是指不同字符使用不同数量的字节进行编码。例如&#xff0c;UTF-8 编码中&#xff0c;ASCII 字符使用 1 个字节编码&#xff0c;而其他语言的字符使用 2 个或更多字节编码。 不可变长编码是指所有字符都使用相同数量的字节进行编码。例如…

【数据结构与算法】动态规划法解题20240227

动态规划法 一、什么是动态规划二、动态规划的解题步骤三、509. 斐波那契数1、动规五部曲&#xff1a; 四、70. 爬楼梯1、动规五部曲&#xff1a; 五、746. 使用最小花费爬楼梯1、动规五部曲&#xff1a; 一、什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Pro…

物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Python_Zebra斑马打印机编程学习笔记(四)】ZPL的一些简单指令

ZPL的一些简单指令 ZPL的一些简单指令前言一、ZPL 介绍二、ZPL 语法解析1、标签开始、标签结束2、标签原点位置设置3、标签长度设置4、标签文本打印深度设置5、标签打印宽度设置6、标签方向设置7、标签元素定位8、标签绘制矩形9、标签输入字段10、标签设置字段字体、大小11、标…

【论文阅读-PRIVGUARD】Day3:1-2节

PRIVGUARD: Privacy Regulation Compliance Made Easier&#xff08;PRIVGUARD&#xff1a;更轻松地遵守隐私规定&#xff09; 摘要 持续遵守如GDPR和CCPA等隐私法规已经成为从小型创业公司到商业巨头的公司的一项昂贵负担。罪魁祸首是当今合规过程中对人工审核的严重依赖&…

Pytorch训练RCAN QAT超分模型

Pytorch训练RCAN QAT超分模型 版本信息测试步骤准备数据集创建容器生成文件列表创建文件列表的代码执行脚本,生成文件列表训练RCAN模型准备工作修改开源代码编写训练代码执行训练脚本可视化本文以RCAN超分模型为例,演示了QAT的训练过程,步骤如下: 先训练FP32模型再加载FP32训练…

壹[1],图像源

1&#xff0c;工具名称:图像源 2&#xff0c;参数说明 2.1&#xff0c;图像源 注&#xff1a; 本地图像&#xff0c;使用本地图片以及本地图像文件夹 相机&#xff0c;连接的相机 SDK&#xff0c;使用相机的SDK&#xff0c;而不是海康SDK 2.2&#xff0c;像素格式 注&…

Jeecg项目部署

说明&#xff1a;Jeecg是一款低代码开发平台&#xff0c;简单说是一款现成的项目&#xff0c;该项目集成了许多功能&#xff0c;我们可以在这个项目之上开发自己的业务代码。 本文介绍Jeecg项目的部署&#xff0c;包括后端jeecg-boot项目、前端vue3项目。前端项目在本地Window…

VScode连接远端服务器一直输入密码解决方法

文章目录 1 关闭远程连接2打开命令面板3 输入remote-ssh: kill vs code server on host… 1 关闭远程连接 2打开命令面板 3 输入remote-ssh: kill vs code server on host… remote-ssh: kill vs code server on host… 然后一路回车(选中出问题的主机)&#xff0c;输一遍密码…

真正理解微软Windows程序运行机制——窗口机制(第一部分)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术&#xff0c;为了解释这个我之前还写过帖子&#xff0c;但是很多人还是不理解。其实这没什么&#xff0c;我在学生时代也被这个问题困绕过。…

【日常聊聊】Sora- 探索AI视频模型的无限可能

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;技术解析 方向二&#xff1a;应用场景 方向三&#xff1a;未来展望 方向四&#xff1a;伦理与创意 方向…