进程环境

LeRobot 机器人学习(Robot Learning)教程(二)经典机器人学 本文探讨了机器人学中基于学习的方法与传统动力学方法的对比与发展趋势。文章指出,传统方法依赖精确的动力学模型和大量人工调参,面临跨任务泛化能力弱、工程复杂度高、物理建模局限性等问题。随着机器学习技术的进步和机器人数据集的丰富,基于学习的方法展现出三大优势:(1)能够实现跨任务与实体的泛化;(2)降低对人类专业知识的依赖;(3)利用历史数据优化性能。文中以平面机械臂为例,分析了传统逆运动学方法的计算复杂性和环境适应性挑战,并指出基于学习的方案在处理高维感知输入、复杂接触动力学等方面具有明显优势。文章认为,结合物 阅读详情

进程环境


起始

  • int main(int argc, char *argv[])
    1. 当执行程序时, 内核先调用exec函数, 这是一个启动例程
    2. 可执行文件将程序的main函数作为了起始地址
    3. 最后在从main函数中获得参数和环境变量

当执行一个新的函数时, 调用exec可以将命令行参数传递给一个新的函数


进程终止

  1. return 0; exit(0);
    • 执行完清理工作(关闭打开的流, 文件), 在进入内核中
    • exit()总是执行一个标准I/O库的清理工作, 对于所有打开的流调用fclose()函数.
  2. _exit(), _Exit();

在执行后, 如果没有调用退出函数, 那么程序执行完的终止码就不确定, 这可能会影响之后我们要调用的函数. 最后的终止码可能时printf的返回值.


在exit清理流的时候, 会调用一些函数, 这些函数一般是由atexit()函数登记的函数. 而exit()调用的函数顺序与登记时的函数相反.(这就像当于atexit()将函数都压入栈, 最后exit()清理时就出栈).

/*************************************************************************
    > File Name: atexit.cpp
    > Author: Function_Dou
    > Mail: 
    > Created Time: 2018年01月29日 星期一 15时23分17秒
 ************************************************************************/

#include <stdio.h>
#include "apue.h"

static void Fun1();
static void Fun2();

int main(void)
{
    if(atexit(Fun1) != 0)
        err_sys("can't error Fun1");

    if(atexit(Fun2) != 0)
        err_sys("can't error Fun2");

    printf("hello world\n");


    exit(0);
}


void Fun1()
{
    printf("one\n");
}

void Fun2()
{
    printf("two\n");
}

输出 ./a.out

hello world
two
one


环境表

每个程序都接受一张环境表, 与参数一样, 环境表也是一个字符指针数组, 其中每个指针包含一个以null结尾的字符串地址. 全局变量environ则包含了指针数组的地址.

通常用getenv和putenv函数来访问特定的环境变量, 而不是用environ变量. 但是如果要查看整个环境变量, 就得使用environ指针.

关于环境表的内容, 删除内容很容易, 但是如果是修改, 增添内容就很复杂了.


存储空间的分配

  1. malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间;
  2. calloc则将初始化这部分的内存,设置为0;
    • malloc()函数和calloc()函数的另一点区别是calloc()函数会返回一个由某种对象组成的数组. 尽管malloc()函数并不能返回一个数组,它所分配的内存空间仍然能供一个数组使用(对realloc()函数来说同样如此.
    • 如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0; 反之, 如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据.也就是说, 使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行, 但经过一段时间后(内存空间已被重新分配)可能会出现问题.
  3. realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放. 而sbrk则是增加数据段的大小

关于sbrk(), brk()函数, 有兴趣的朋友可以参考下面的链接.
http://blog.youkuaiyun.com/sgbfblog/article/details/7772153


setjmp() longjmp()函数

  1. int setjmp(jmp_buf env);
    • 参数 env 即为保存上下文的 jmp_buf 结构体变量;
    • 如果直接调用该函数,返回值为 0; 若该函数从 longjmp 调用返回,返回值为非零,由 longjmp 函数提供。根据函数的返回值,我们就可以知道 setjmp 函数调用是第一次直接调用,还是由其它地方跳转过来的
  2. void longjmp(jmp_buf env, int val);
    • 参数 env 是由 setjmp 函数保存过的上下文.
    • 参数 val 表示从 longjmp 函数传递给 setjmp 函数的返回值,如果 val 值为0, setjmp 将会返回1,否则返回 val.
    • longjmp 不直接返回,而是从 setjmp 函数中返回,longjmp 执行完之后,程序就像刚从 setjmp 函数返回一样
/*************************************************************************
    > File Name: setjmp_longjmp.cpp
    > Author: Function_Dou
    > Mail: 
    > Created Time: 2018年01月29日 星期一 16时09分01秒
 ************************************************************************/

#include <stdio.h>
#include <setjmp.h>

jmp_buf env;

static int a = 1;

void Fun()
{
    a = 2;
    longjmp(env, a);
    printf("three\n");
}

int main(void)
{
    if(setjmp(env) == 0)
    {
        printf("one\n");
        Fun();
    }
    else
        printf("two\n");


    return 0;
}

输出结果: ./a.out

one
two

因为最开始调用setjmp(env)时, 返回0, 所以输出了 one ; 之后调用了函数Fun(), 执行到longjmp(env, a)时, 又直接跳转到setjmp(env), 此时setjmp()返回longjmp()中的a, 所以输出了two, 而three就直接跳过没有执行.

考虑到有些人没有啊apue.h这个文件, 可以把apue.h删除, 然后在文件里面加上这样一段代码. 这个是最简单的解决方法了, 不用大改代码.

#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdarg.h>

void err_sys(const char *fmt, ...)
{
    printf("%s\n",fmt);

    exit(1);
}
MIPI D-PHY TX 一致性测试实例解析 Part 02 如果测过1.3.x,并对这组测试的细节已经熟悉的前提下,1.4.x的测试将会变得轻松,因为几乎相同的测试项被用于时钟通道的数据测量。 阅读详情

相关推荐

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

进程环境(七)

进程环境 主要介绍了如下内容: * 当程序执行时,其main函数是如何被调用的; * 命令行参数是如何传递给应用程序的; * 典型的存储空间布局是什么样式; * 如何分配另外的存储空间; * 进程如何使用环境变量; * 进程的各种不同终止方式等 介绍 main函数: c语言总是从main函数启动的 int main(int argc, char *argv[])...

JOE'S BLOG 203

单细胞转录组数据分析全流程:从原始数据到细胞注释

本文详细介绍了单细胞转录组数据分析的全流程,从原始数据读取、环境搭建、数据质控与标准化,到降维聚类、细胞类型注释,以及高级质控与多样本整合。重点阐述了如何利用Seurat等工具进行数据处理,并通过标志基因比对与自动注释方法完成细胞身份鉴定,为研究者提供了一套清晰、可操作的分析指南。

coffee的博客 553

进程环境 一

main函数 我们先分析一下当一个C程序开始执行时,main函数是如何被调用的。C程序总是从main函数开始执行,java、C++、C#等这些类C语言的程序也是。(这里是我的猜测,以后需要求证) main函数的原型: int main (int argc, char* argv[]); 其中,argc是命令行参数的数目,argv是指向命令行参数的指针所组成的数组。当内核执行C程序时(其实使用一个...

Bluce的博客 325

104报文解析工具

可选择包含报文的文本文件或日志文件进行解析,可选择按条数范围或时间范围,输出结果可以在报文解析显示区,也可以输出到文件。可以对文本内容的报文文件进行高级分析,包括遥信遥测等通讯数据的具体信息,通讯帧的统计,通讯次数的统计,各种错误的分析,报文的定位功能,传输的文件具体内容等。输入完成后点击工具栏的解析报文按钮或使用右键菜单的解析就可以对报文进行解析。在报文输入区输入待解析报文并解析后,解析结果就显示在报文解析显示区和报文定位展示区及报文定位条目区。当有多条报文解析后,可以通过报文列表树具体定位某条报文。

XZHOUMIN的博客 5949

AI赋能软件测试:从冒烟测试到全流程智能化的效率革命

软件测试是确保软件质量的关键环节,其核心原理是通过预设用例验证系统功能是否符合预期。传统测试方法依赖人工编写和维护脚本,面临维护成本高、适应性差等挑战。随着人工智能技术的发展,特别是自然语言处理和计算机视觉的成熟,AI为测试领域带来了新的技术价值。通过让AI理解应用界面和业务逻辑,可以实现测试用例的智能生成、自主执行和结果分析,显著提升测试效率和覆盖率。在实际应用场景中,AI驱动的冒烟测试能够动态适应UI变化,自动分析失败日志,将测试人员从重复劳动中解放出来,专注于更复杂的质量策略设计。本文基于AI在冒烟测

weixin_28841265的博客 306

进程环境+进程终止

进程所需环境:启动程序,内存划分,c库,环境变量;启动代码由编译器提供(源码或.o文件),语言汇编语言。程序的启动(有os情况,裸机);程序的终止,正常终止:return,exit,_exit;异常终止:信号,abort或ctrl+c

laugh哥的博客 811

光谱预处理最简单实现方法--基于OpenSA光谱分析库

系列文章目录 “光晰本质,谱见不同”,光谱作为物质的指纹,被广泛应用于成分分析中。伴随微型光谱仪/光谱成像仪的发展与普及,基于光谱的分析技术将不只停留于工业和实验室,即将走入生活,实现万物感知,见微知著。本系列文章致力于光谱分析技术的科普和应用。 文章目录系列文章目录前言一、数据来源二、代码解读2.1 读取数据2 .2 划分数据集2 .3 返回训练集和测试集并绘制光谱图片2.4 建立1-D CNN模型2.5 训练1-D CNN模型2.6 测试1-D CNN模型2.7 运行CNN模型,并用查看结果总结

Echo_Code的博客 7067

《UNIX环境高级编程》进程环境、进程控制

2301_80345648的博客 1051

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5588

进程的环境

当程序执行时,其main函数是如何被调用的;命令行参数是如何传递给新程序的;典型的存储空间布局是什么样式;如何分配另外的存储空间;进程如何使用环境变量;进程的各种不同终止方式等。另外,还将说明longjmp和setjmp函数以及它们与栈的交互作用。

jeffery 的博客 1065

基于Simulink的发动机管理系统中的自适应增压控制系统设计

通过上述详细设计步骤,我们成功开发了一个基于Simulink的自适应增压控制系统。该系统不仅能够实时监测和预测发动机的运行状态,动态调整增压压力目标值,还具备实时监控、故障诊断和保护功能,确保系统的安全性和可靠性。此外,通过仿真实验和硬件在环测试,我们验证了系统的性能,并对其进行了优化,使其能够更好地满足实际应用需求。这个项目展示了如何利用MATLAB/Simulink的强大功能,结合控制理论和工程实践,开发出高效、可靠的自适应增压控制系统。

MHD0815的博客 220

进程环境和进程控制

进程环境和进程控制

learning_ape的博客 190

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[Linux]僵尸进程,孤儿进程,环境变量

僵尸进程    定义与特征     定义     特征    产生原因    解决方法    注意事项 孤儿进程    产生原因    处理机制    特点与影响 环境变量    一、环境变量的分类    二、常见的环境变量    三、查看环境变量    四、添加和删除环境变量     添加环境变量     删除环境变量    五、环境变量的作用    六、环境变量的加载顺序

ormstq的博客 1951

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

进程的环境列表

进程的环境列表和修改

superficial11的博客 222

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux进程环境

关于进程的学习,我们先来认识一下进程的环境。 本篇我将说到以下几个问题: 当程序执行时,main函数是如何被调用的? 命令行参数是如何传递给新程序的? 典型的存储空间布局是什么样式? 如何分配另外的存储空间? 进程如何使用环境变量? 进程的各种不同终止方式? main函数 C程序总是从main函数开始执行,main函数的原型是: int main(int argc,char* argv[]...

一条二哈 311

【Linux】进程优先级 && 进程切换 && 环境变量

本文详细讲述了进程的优先级,进程切换,重点讲解了环境变量,里面内容丰富,含有代码演示及图片,可以帮助大家更好的理解。

m0_63198468的博客 2423

Unix进程环境之3---进程环境列表

<br /><br />1:进程环境<br />简介当一个进程(proecss)调用另一个程序(program)时,同时会传递这个程序执行的环境列表(environment list)。<br />进程环境列表是一个字符指针数组,每个字符指针是一个以空字符(null-terminated)结束的C字符串。<br />字符指针数组地址包含在全局变量environ里。如下:<br />extern char **environ;<br />加入环境包含五个字符串,则表示为以下图示:<br /><br />通常环

Harry的专栏 1425

【unix】进程环境、进程控制

进程相关

qq_60755751的博客 180

五、进程环境

Linux 系统一共有 8 种进程终止方式,其中 5 种为正常终止方式:1)从 main() 函数返回;2)调用 exit(3) 函数;3)调用 _exit(2) 或 _Exit(2) 函数;4)最后一个线程从其启动例程返回;5)从最后一个线程调用 pthread_exit(3) 函数。剩下的 3 种为异常终止方式:6)调用 abort(3) 函数;7)接收到一个信号;8)最后一个线程对取消请求作出响应。

qq_43420088的博客 950
上一篇: 标准I-O流
下一篇: 进程控制之fork()与vfork()函数
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值