Day 2.exec函数族和线程的基本概念、相关函数接口

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:在系统指定目录下查找文件

1)自定义一个程序(文件名为apple)

#include "head.h"int main(int argc,const char *argv[])
{int i = 0;printf("=============================\n");printf("how are you!\n");for (i = 0; i < argc; ++i){printf("argv[%d] = %s\n",i,argv[i]);}return 0;
}

2)int execl/int execv引用运行

#include "head.h"int main(void)
{
//	char *argv[5] = {"./hello","apple","bullll",NULL};printf("1111111\n");execl("./apple","./hello","apple","bullll",NULL);    //以参数形式传递   第一个时要运行的文件路径 后面是传递的参数
//	execv("./apple",argv);	      //以指针数组形式传递  定义指针数组如上printf("222222222222222\n");return 0;
}

getenv

char *getenv(const char *name);

功能:获得环境变量名对应的值

setenv

int setenv(const char *name, const char *value, int overwrite);

功能:设置环境变量的值

参数:

name:环境变量名

value:环境变量的值

overwrite:非0   覆盖

                    0     不覆盖

返回值:成功返回0;失败返回-1

#include "head.h"int main(void)
{char tmpbuff[1024] = {0};printf("================================\n");printf("PATH:%s\n",getenv("PATH"));                      //获得PATH的系统路径printf("================================\n");getcwd(tmpbuff,sizeof(tmpbuff));                        //得到将当前路径 并将其放到数组中setenv("PATH",tmpbuff,1);           //将PATH的路径替换为数组中的内容printf("=================================\n");printf("PATH:%s\n",getenv("PATH"));                       //打印替换后的路径printf("=================================\n");execlp("apple","./hell","apple","bullll",NULL);     //参数以列表形式 在系统路径下查找文件 并执行 注:第一个参数是要执行的文件名return 0;}

system

int system(const char *command);

功能:执行shell命令

特点:传递一个命令参数,执行成功后,会回到原来程序运行的位置继续向下执行,而exec函数是执行失败后回到原来的位置继续向下执行;者两点注意区分。

#include "head.h"int Msystem(const char *p)
{char tmpbuff[1024] = {0};char *parg[10] = {0};int cout = 0;strcpy(tmpbuff,p);                       //将传过来的字符串常量以字符串的形式给到数组中parg[cout] = strtok(tmpbuff," ");                //在第一个空格的地方分解字符串cout++;while ((parg[cout] = strtok(NULL," ")) != NULL)  //将剩余的字符串继续以空格分割 放到指针数组中{cout++;}pid_t pid;          pid = fork();   //创建一个子进程用来单独执行命令if (pid == -1){perror("fail to fork");return -1;}if (pid == 0)                   {execvp(parg[0],parg);       //调用execvp函数 参数以指针数组的形式 在系统目录下找到该命令并执行}wait(NULL);     //当子进程结束 回收子进程return 0;
}int main(void)
{printf("system上面!\n");Msystem("ls -l");                 //封装一个system函数printf("system下面!\n");return 0;
}

线程

1.基本概念

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

2.线程的创建

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

3.线程的调度

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

4.线程的消亡

僵尸态:线程代码结束,空间没有被回收,称为僵尸线程

5.进程和线程的区别

1)进程是操作系统资源分配的最小的单元;

2)线程是CPU任务调度的最小单元(多线程的系统和调度比进程更节省CPU资源空间)

6.多线程和多进程的优缺点

效率:多线程 > 多进程

  多线程只需要在同一进程空间切换;

  多进程需要在不同空间中切换

通信:多线程 > 多进程

  线程共享全局变量,可以通过全局变量实现数据通信

  进程空间独立,没有共享空间,通信实现比较复杂

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

  线程共享空间是会引发资源竞争

  进程没有共享空间,不存在资源竞争的问题

安全:多进程 > 多线程

  一个进程异常不会影响其余进程空间

  一个线程异常结束会导致进程异常结束,进程异常结束,该进程内所有线程任务均无法向下执行

7.线程相关的函数接口

创建: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选项  

练习:

创建三个线程,并执行

/****************************************一次创建多个不同的线程*每个线程执行不同的任务*可以定义一个函数指针数组进行遍历* ************************************/
#include "head.h"void *threadfun1(void *argc)
{printf("线程1(%#x)开始!\n",(unsigned int)pthread_self());return 0;
}void *threadfun2(void *argc)
{printf("线程2(%#x)开始!\n",(unsigned int)pthread_self());return 0;
}void *threadfun3(void *argc)
{printf("线程3(%#X)开始!\n",(unsigned int)pthread_self());return 0;
}int main(void)
{int ret = 0;int i = 0;pthread_t tid[3];void* (*tip[3])(void*) = {threadfun1,threadfun2,threadfun3};    //有一个void*返回值并有一个void*参数的函数指针数组for (i = 0; i < 3; ++i){ret = pthread_create(&tid[i],NULL,tip[i],NULL);if (ret != 0){perror("fail to pthread");return -1;}}while(1){}return 0;
}

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 

失败返回错误码

示例:
#include "head.h"void *thread(void* argc)
{printf("进程开始!(PID:%#x)\n",(unsigned int)pthread_self());printf("进程即将结束!\n");sleep(5);printf("结束!\n");pthread_exit("over!");return NULL;
}int main(void)
{int ret = 0;pthread_t tid;void *gid = NULL;ret = pthread_create(&tid,NULL,thread,NULL);if (ret != 0){perror("fail to pthread");return -1;}pthread_join(tid,&gid);printf("gid=%s\n",(char *)gid);return 0;
}

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

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

相关文章

无人艇军事应用展望与思考

源自&#xff1a;《远望要报》 作者&#xff1a;赵国安 “人工智能技术与咨询” 发布 一、无人艇作战使用场景 二、军用无人艇的发展趋势 三、军用无人艇的关键技术 四、世界主要国家无人艇发展动态 结束语 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参…

Vue概念详解【目录】

本专栏简介&#xff1a; 这个专栏是关于 Vue2 和 Vue3 各种概念的大集合&#xff01;它深入挖掘原理&#xff0c;分析各种优势和劣势&#xff0c;适配各种应用场景&#xff0c;部分内容还列出了代码示例&#xff0c;以清晰地讲述原理。在这里&#xff0c;你将全面了解 Vue2 和…

集团机构组网

在数字化转型的浪潮中&#xff0c;企业网络需求日益复杂化&#xff0c;尤其是对于大规模的集团机构来说&#xff0c;高效、安全且可靠的网络连接成为了业务发展的关键。传统网络架构已难以满足这些需求&#xff0c;而SD-WAN&#xff08;软件定义广域网&#xff09;技术的崛起&a…

四川易点慧电子商务有限公司抖音小店:可靠的新零售典范

随着电子商务的迅猛发展和社交媒体的广泛普及&#xff0c;越来越多的消费者选择在网上购物。在这个背景下&#xff0c;四川易点慧电子商务有限公司以其独特的商业模式和强大的供应链整合能力&#xff0c;在抖音小店平台上崭露头角&#xff0c;成为了一个值得信赖的购物新选择。…

提高办公效率:Excel在文秘与行政办公中的应用技巧

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今信息化时代&#xff0c;Excel作为一款常…

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…

B树和MySql索引

1.什么是B树 它是一种平衡得多叉树&#xff0c;称为B树&#xff0c;一颗M阶的B树&#xff0c;是一颗平衡的M路的多叉树&#xff0c;可以是空树或者满足一下性质&#xff1a; 根节点至少有两个孩子。每个节点都包含k-1个关键字和K个孩子&#xff0c;其中 ceil(m/2) ≤ k ≤ m …

安泰超声功率放大器技术参数有哪些

超声功率放大器是一种用于放大超声信号的设备&#xff0c;而超声功率放大器的技术参数对于设备的性能和应用场景起着重要作用。在本文中&#xff0c;我们将介绍一些常见的超声功率放大器的技术参数。 功率输出&#xff1a;超声功率放大器的功率输出是指放大器能够输出的最大功率…

【Android移动开发】Windows10平台安装Android Studio与人工智能算法模型部署案例

目录 一、Android Studio下载地址二、开发环境JDK三、开始安装Android Studio四、案例展示与搭建五、人工智能算法模型移动端部署案例参考 一、Android Studio下载地址 https://developer.android.google.cn/studio/install.html 电脑配置要求&#xff1a; 下载保存在指定文…

3.Prometheus数据模型

采样时间戳 指标 指标值平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我。 跟着我从0学习JAVA、spring全家桶和linux运维等知识&#xff0c;带你从懵懂少年走向人生巅峰&#xff0c;迎娶白富美&#xff01; 关注微信公众号【 IT特靠谱 】&#xff0…

Niginx介绍和安装使用

Nginx是什么&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一…

你并不了解 JavaScript:作用域与闭包 - 第二版 - 第八章:模块化模式

第八章&#xff1a;模块化模式 在本章中&#xff0c;我们将通过探索所有编程中最重要的代码组织模式之一&#xff1a;模块&#xff0c;来结束本书的正文。正如我们将看到的那样&#xff0c;模块本质上是由我们已经讲过的内容构建而成&#xff1a;这是你学习词法作用域和闭包所…

k8s(5)

目录 使用Kubeadm安装k8s集群&#xff1a; 初始化操作&#xff1a; 每台主从节点&#xff1a; 升级内核&#xff1a; 所有节点安装docker &#xff1a; 所有节点安装kubeadm&#xff0c;kubelet和kubectl&#xff1a; 修改了 kubeadm-config.yaml&#xff0c;将其传输给…

Azure Eventhub项目引入Servicebus报NoClassDefFoundError

前提 现有项目使用azure eventhub作为IOT数据载体进行数据传输。由于业务需要&#xff0c;需要同时引入servicebus。 <dependency><groupId>com.azure</groupId><artifactId>azure-messaging-servicebus</artifactId><version>7.13.3<…

springboot网站开发-使用MultipartFile上传图片文件到远程服务器

springboot网站开发-使用MultipartFile上传图片文件到远程服务器&#xff01;昨天上午在准备网站的一些 图片&#xff0c;下午在测试图片上传的模块&#xff0c;走了一些弯路&#xff0c;今天和大家分享一下&#xff0c;免得大家再走弯路。 首先&#xff0c;要和大家声明一件事…

vue3使用echarts绘制地图

vue3使用echarts绘制地图 安装echarts npm install echarts下载地图的json数据【我这里是把json数据单独粘出来然后新建了一个文件china.json】 下载中国及各个省份的地图数据引入 import chinaJson from ./china.json绘制地图 <template><div ref"myChart&q…

面试经典150题【31-40】

文章目录 面试经典150题【31-40】76.最小覆盖字串36.有效的数独54.螺旋矩阵48.旋转图像73.矩阵置零289.生命游戏383.赎金信205.同构字符串290.单词规律242.有效的字母异位词 面试经典150题【31-40】 76.最小覆盖字串 基本思路很简单&#xff0c;就是先移动右边到合适位置。再移…

网络安全与IP安全网络安全

网络安全与IP安全网络安全 网络安全 是指网络系统的硬件&#xff0c;软件以及系统中的数据收到的保护。 保护的基本属性为&#xff1a;机密性&#xff0c;身份认证&#xff0c;完整性和可用性&#xff1b; 基本特征&#xff1a;相对性&#xff0c;时效性&#xff0c;相关性…

[面试]我们常说的负载均衡是什么东西?

什么是负载均衡 如果用户量很多, 服务器的流量也随之增大, 此时出现两个问题, 软件性能下降 容易出现单点故障 为了解决这些问题, 引入了集群化架构, 也就是把一个软件同时部署在多个服务器上 集群化架构出现的问题 架构改变后又出现了两个问题 如何将请求均匀的发送到多…

大疆无人机视频删了怎么恢复?尝试这些恢复技巧

无人机拍摄的视频已经成为许多飞行爱好者和专业人士珍贵的记忆与资料。然而&#xff0c;误删视频是许多人都可能遇到的问题。当您不慎删除了大疆无人机中的视频时&#xff0c;不必过于焦虑。本文将为您详细介绍如何恢复这些误删的视频&#xff0c;帮助您找回宝贵的回忆。 图片来…