嵌入式学习---DAY24:进程--二

一、exec函数族----启动一个新程序

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),
子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的
用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建
新进程,所以调用exec前后该进程的id并未改变。
其实有六种以exec开头的函数,统称exec函数:

1.execl   execv

int exec l(const char *path,              const char *arg,      ...);

                要运行文件的路径  要执行的文件名   要执行文件需要的参数

                                                                  以NULL结尾

int exec v(const char *path, char *const argv[]);

将除了文件路径的其他放入char *const argv[]中。

l --- list                     //ls -l / 

path  ---文件路径                  "/bin/ls"
arg  ---> 要执行的 文件的名字           "ls"

"-l"         "/"             NULL              表示结束 

#include <stdio.h>
#include <unistd.h>int main(int argc, const char *argv[])
{printf("---begin---\n");//execl("/bin/ls","ls","-l",".",NULL);//char * const arg[] ={"ls","-l",".",NULL}; //execv("/bin/ls",arg);execl("/home/linux/linux_prog/01-prog/mycp","mycp","1.c","2.c",NULL);printf("---end---\n");return 0;
}

2.execlp    execvp

 int exec l p(const char *file, const char *arg, ...);

p-----表示要执行的文件,从PATH环境变量中去找。

出错才有返回值,返回值为-1,

  int exec v p(const char *file, char *const argv[]);

和execv一致,除file其余放入char *const argv[]中

#include <stdio.h>
#include <unistd.h>int main(int argc, const char *argv[])
{printf("---begin---\n");//execl("/bin/ls","ls","-l",".",NULL);//char * const arg[] ={"ls","-l",".",NULL}; //execv("/bin/ls",arg);//execl("/home/linux/linux_prog/01-prog/mycp","mycp","1.c","2.c",NULL);//if (execlp("mycp","mycp","1.c","2.c",NULL) < 0)char *const arg[] = {"mycp","1.c","2.c",NULL};if (execvp("mycp",arg) < 0){perror("execl fail");return -1;}printf("---end---\n");return 0;
}

l 与 v 的区别后面参数是为数组(v)还是直接写入(l)。

3.execle  execvpe

带e 表示的是可以给要执行的 新程序 传递需要的 环境变量 

int execle (const char *path,         const char *arg,              ...,                       char * const envp[]);

                     要运行文件的路径  要执行的文件名   要执行文件需要的参数    环境变量

#include <stdio.h>
#include <unistd.h>
extern char **environ;int main(int argc, const char *argv[])
{char *menv[] = {"USER=linux","PASSWD=123456",NULL};//execle("./myenv","myenv",NULL,environ);//execle("./myenv","myenv",NULL,menv);execle("./myenv","myenv",NULL,menv);return 0;
}

environ:系统环境变量,环境变量可自定义,也可为NULL ,以下代码为系统环境变量

#include <stdio.h>
extern char **environ;int main(int argc, const char *argv[])
{int i = 0;while (environ[i] != NULL){printf("env[%d] = %s\n",i,environ[i]); //char * ++i;}return 0;
}

 int execvpe(const char *file, char *const argv[]  ,   char * const envp[]);

路径加文件名
1.带l的默认会搜索当前路径下。
2.带p的只搜索只搜索PATH系统环境变量

子进程做与父进程相同的事情------创建子进程,执行任务即可

子进程做与父进程不同的事情------fork + exec

二、进程的终止

1.main中返回ruturn

return  当该关键字出现在main函数中时候可以结束进程,如果在其他函数中则表示结束该函数

2.exit-----库函数

void exit(int status) 

功能:让进程退出,并刷新缓存区

参数:status:进程退出的状态

返回值:缺省

会调用atexit函数

3._exit-----系统调用

void _exit(int status);

功能:让进程退出,不刷新缓存区

参数:status:进程退出状态

返回值:缺省

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{printf("hello world!\n");exit(0);         //(3)库函数//_exit(0);      //(2)系统调用return 0;
}

4.atexit

int atexit(void (*function)(void));

功能:注册进程退出前执行的函数

参数:function:函数指针,指向void返回值void参数的函数指针

返回值:成功返回0,失败返回非0

当程序调用exit或者由main函数执行return时,所有用atexit

注册的退出函数,将会由注册时顺序倒序被调用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void cleanup(void)
{free(q);printf("----cleanup---\n");
}
int main(int argc, const char *argv[])
{atexit(cleanup);printf("hello world!\n");return 0;
}

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

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

相关文章

什么是 Java?

探索 Java&#xff0c;一种多功能且功能强大的编程语言。释放其构建强大应用程序的潜力。 前言 简单来说&#xff0c;Java 是一种用于开发软件应用程序的面向对象设计的编程语言。截至 2019 年&#xff0c;它是世界上最受欢迎的编程语言&#xff0c;尤其是因为它是开源的&#…

QT 布局管理器之QHBoxLayout

文章目录 概述.ui来看看Cmain.cpp运行 小结 概述 QHBoxLayout&#xff0c;在QT中是一个布局文件&#xff0c;而且相对来说还是比较简单的。接下来看下。 .ui 先看下在qt design中是如何用的&#xff0c;如下图&#xff1a; 就是这个布局文件&#xff0c;是一个xml的文件&am…

动起来!Axure动画的实用技巧

前言 在数字产品的世界中&#xff0c;用户体验的每一个细节都至关重要。 动画&#xff0c;作为一种增强交互性和视觉吸引力的手段&#xff0c;已经成为现代界面设计中不可或缺的元素。 Axure&#xff0c;作为一款强大的原型设计工具&#xff0c;提供了丰富的动画功能&#x…

Windows下编译安装PETSc

本文记录在Windows下使用MinGW-w64编译安装PETSc的流程。 0、环境 操作系统Windows 11MSYS2msys2-x86_64-20240507 1、开发环境 首先&#xff0c;下载并安装MSYS2&#xff0c;然后编辑PATH环境变量&#xff0c;添加mingw64相关路径&#xff1a;C:\msys64\mingw64\bin。 然后…

【项目分享】使用python的ttkbootstrap模块构建一个炫酷的计时器

目录 前言 项目背景 项目展示&#xff08;图片&#xff09; 项目实现 1. 安装与设置 2. 创建主窗口 3. 初始化计时器功能 4. 实现计时功能 5. 实现隐藏边框与置顶功能 6. 运行应用 完整代码 结论 &#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f…

从零开始实现循环神经网络

本节我们通过使用MXnet&#xff0c;来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后&#xff0c;即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示&#xff1a; 接…

Linux的常用操作-02

一&#xff1a;Linux的系统目录结构 /bin bin是ary的缩写&#xff0c;这个目录存放着最经常用的命令 /boot&#xff1a;这里存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev&#xff1a;dev是Device(设备)的缩写,该目录下存放的是Lin…

Servlet——个人笔记

Servlet——个人笔记 文章目录 [toc]Servlet简介Servlet命名Servlet由来实现过程 Servlet 相对 CGI 的优势简要说说什么是CGI Servlet 在IDEA中开发流程Servlet注解方式配置WebServlet注解源码WebServlet注解使用 Servlet常见容器Servlet 生命周期简介测试 Servlet 方法init()…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序,设计相关算法完成以下功能。 (1)输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 (2)输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单路径。 (3)输出如图所示的有向图 G 从顶点 5 到顶点…

【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch

服务器更新后&#xff0c;输入nvidia-smi出现如下报错&#xff1a; 解决方法参考&#xff1a; 已解决【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法-腾讯云开发者社区-腾讯云 (tencent.com) 输入命令查看nvidia驱动的版本号&#xff1a…

python从入门到精通:判断语句

目录 前言 1、布尔类型和比较运算符 2、if语句的基本格式 3、if else语句 4、if elif else语句 5、判断语句的嵌套 6、实战演练 前言 逻辑判断是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能。 判断是程序最基础最核心的逻辑…

Hive3:识别内部表、外部表及相互转换

一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值&#xff0c;我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…

应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇)

目录 概述lscpu-显示有关CPU架构的信息uname-查看系统信息lsmod-输出加载的所有模块lastb-输出最后登录失败的用户last-展示用户最近登录信息lastlog-展示所有用户最后的登录时间systemctl-系统服务&#xff0c;开机自启排查crontab-计划任务选项 history-查看历史命令选项常用…

正向代理 vs 反向代理:有什么区别?

在本文中&#xff0c;我们将讨论&#xff1a; 什么是常规代理&#xff08;正向代理&#xff09;&#xff1f;什么是反向代理&#xff1f;我应该为我的业务选择哪种代理&#xff1f;使用正向和反向代理的案例完成任务的代理替代方案 什么是常规代理&#xff08;正向代理&#…

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事&#xff0c;便想着研究一下Electron&#xff0c;没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…

haproxy是什么?以及haproxy基础实验

目录 一、什么是负载均衡&#xff1f; 二、为什么要用haproxy&#xff1f; 三、haproxy的基本部署实验&#xff1a; 3.1 基本配置实验 环境准备&#xff1a; 详细步骤&#xff1a; 3.2 haproxy-多进程与多线程实验&#xff1a; 多进程&#xff1a; 多线程&#xff1a;…

【开源 Mac 工具推荐之 4】Awesome-macOS:全能的宝藏工具库

简介 Awesome-macOS 是一个开源项目&#xff0c;属于 GitHub 的热门项目“Awesome”的体系&#xff0c;旨在为 macOS 用户提供一个集合了各种优秀的 macOS 应用程序、插件、脚本和工具的精选列表。该项目由开源社区共同维护&#xff0c;通过不断收集和整理优秀的macOS资源&…

LeetCode - 209 - 长度最小的子数组

力扣209题 题目描述&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数组&…

IO网络编程

思维导图 作业一&#xff1a;使用wasd控制机械臂 #include<myhead.h> #include <termios.h> #define SER_PORT 8888 //与服务器保持一致 #define SER_IP "192.168.0.103" //服务器ip地址 #define CLI_PORT 6666 //客户端…