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://www.rhkb.cn/news/264612.html

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

相关文章

9.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏连接服务器的操作

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏底层功能对接类GameProc的实现 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 码云版本号&#xff1a;44c54d30370d3621c1e9ec3d7fa1e2a0…

全球游戏市场回暖,Flat Ads推动海外获客增长

摘要:热门游戏品类分析,解读新兴市场与赛道 近日,中国音数协游戏工委发布了《2023年中国游戏出海研究报告》,据报告数据显示,2023年,全球游戏市场规模11773.79亿元,同比增长6.00%,呈现增长回暖趋势。 图源:伽马数据 1.SLG和RPG游戏热度居高不下,休闲游戏增长势头强劲 目前,S…

Java四大引用详解:强引用、软引用、弱引用、虚引用

在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在商店购买了某样物品后&#xff0c;如果有用就一直保留它&#xff0c;否则就把它扔到…

进行模型测量这种量出来坡面的是平面面积还是真实面积?

斜面面积&#xff0c;不是表面积。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 #DasViewer##实景三维##三维重建##三维模型…

基于springboot+vue的音乐网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Java优先级队列--堆

目录 1. 优先级队列 1.1 概念 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆向下调整 2.3.2 堆的创建 2.3.3 建堆的时间复杂度 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 3.常用接口介绍 3…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求&#xff0c;磕磕碰碰总…

初学学习408之数据结构--数据结构基本概念

初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容&#xff0c;作为初学者的我会尽力详细直白地介绍数据结构的…

元学习(meta-learning)的通俗解释

目录 1、什么是元学习 2、元学习还可以做什么 3、元学习是如何训练的 1、什么是元学习 meta-learning 的一个很经典的英文解释是 learn to learn&#xff0c;即学会学习。元学习是一个很宽泛的概念&#xff0c;可以有很多实现的方式&#xff0c;下面以目标检测的例子来解释…

JSON简介以及如何在Python中使用JSON

什么是JSON&#xff1f; JSON是"JavaScript Object Notation"的简称&#xff0c;是一种数据交换格式 JSON格式 假设我们有一个对象&#xff0c;这个对象有两个属性&#xff1a;“name”跟“age”。 在JSON中是这样表达的&#xff1a; { "name":"男孩…

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于JAVA springbootmybatis智慧生活分享平台设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 可定制系统 欢迎点赞 收藏 …

FL Studio Producer Edition2024中文进阶版Win/Mac

FL Studio Producer Edition&#xff0c;特别是其【中文进阶版 Win/Mac】&#xff0c;是数字音乐制作领域中的一款知名软件。它为广大音乐制作人、声音工程师以及音乐爱好者提供了一个从音乐构思到最终作品发布的完整解决方案。这个版本特别为中文用户优化&#xff0c;并兼容W…

Leetcode——hot3最长连续序列

最长连续序列 class Solution {public int longestConsecutive(int[] nums) {if(nums.length 0 || nums.length 1){return nums.length;}Arrays.sort(nums);int count 1;int max 1;for(int i 0; i < nums.length - 1; i){if(nums[i1] - nums[i] 1){count;if(count &…

[Linux]文件基础-如何管理文件

回顾C语言之 - 文件如何被写入 fopen fwrite fread fclose fseek … 这一系列函数都是C语言中对文件进行的操作&#xff1a; int main() {FILE* fpfopen("text","w");char str[20]"write into text";fputs(str,fp);fclose(fp);return 0; }而上…

中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)

中间件-Nginx漏洞整改&#xff08;限制IP访问&隐藏nginx版本信息&#xff09; 一、限制IP访问1.1 配置Nginx的ACL1.2 重载Nginx配置1.3 验证结果 二、隐藏nginx版本信息2.1 打开Nginx配置文件2.2 隐藏Nginx版本信息2.3 保存并重新加载Nginx配置2.4 验证结果2.5 验证隐藏版本…

MATLAB环境下基于高斯滤波器-广义拉普拉斯算子的细胞核自动检测

作为病理图像分析的基础&#xff0c;细胞核检测可为细胞形态、纹理等多种相关分析提供支持&#xff0c;对于临床诊断具有重要意义。但是细胞核的人工识别过程十分费时费力&#xff0c;并且不同医生之间存在主观标注差异。因此&#xff0c;利用计算机技术进行自动检测能够更为客…

3、函数定义,函数调用,this指向总结,闭包

一、函数的定义方式 1、函数声明 function demo1() {var num 12var result Math.pow(num,2)//指数函数return result }2、函数表达式 var demo2 function (x,y) { //内置对象arguments前面的两个参数 是 x,yvar sum arguments[0] arguments[1]console.log(sum) }3、构…

BUGKU-WEB 备份是个好习惯

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 看源码看提示&#xff1a;备份是个好习惯扫描目录md5弱比较 相关工具 御剑md5解密&#xff1a;https://www.somd5.com/ 解题步骤 看到的这串字符&#xff0c;有点像md5&#xff1f; d41d8cd98…

面试总结之JVM入门

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;你为什么要学习JVM&#xff1f;&#x1f380;JVM的作用 &#x1f380;JVM的构成&#xff08;5大类&#xff09;&#x1f3e8;1.类加载系统&#x1f415;类什么时候会被加…