父子进程exec,fork等

linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用-CSDN博客

C++中的exec()函数_c++ exec函数_向阳逐梦的博客-CSDN博客

前言
fork 函数之后,如果想要把子进程换成一个我想要执行的进程,这时,就不得不使用 exec()函数了,这也是 fork()的意义所在。当然,exec系列的函数也可以将当前进程替换掉,不一定非要fork()一个子进程。常见的fork()调用例子有很多,比如从 wechat发起一个语音电话、从 bash或者zsh执行一个 a.out 程序,都是在利用exec系统调用将新产生的子进程完全替换成目标进程。

比如,这是一个死循环程序(目的是为了观察,让它活得久一点):

C++并行编程_c++ exec函数-CSDN博客

2.2 exec函数族
目的:让子进程不执行父进程正在执行的程序

exec函数族提供了让进程运行另一个程序的方法。exec函数族内的函数可以根据指定的文件名或目录名找到可执行程序,并加载新的可执行程序,替换掉旧的代码区、数据区、堆区、栈区与其他系统资源。这里的可执行程序既可以是二进制文件,也可以是脚本文件。在执行exec函数族函数后,除了该进程的进程号PID,其他内容都被替换了。
-----------

 所需头文件:#include<unistd.h>

    函数原型:

        //excel("/bin/ps","ps","-ef",NULL)//系统执行ps -ef,注意参数的写法int execl(const char *path, const char *arg,…)//execlp("ps","ps","-ef",NULL)//第一个参数只需要写ps即可,系统会根据环境变量自行寻找ps程序的位置int execlp(const char *file, const char *arg,…)//execle()函数将一个新的环境变量添加到子进程中// char *envp[]={"PATH=/tmp","USER=liyuge",NULL};//设定新的环境变量,注意使用NULL结尾//execle("/usr/bin/env","env",NULL,envp)int execle(const char *path, const char *arg,…, char *const envp[])//char *arg[]={"ps","-ef",NULL};execvp("ps",arg)//注意参数与execlp()函数的区别int execv(const char *path, char *const argv[])int execvp(const char *file, char *const argv[])//char *arg[]={"env",NULL};//设定参数向量表,注意使用NULL结尾//char *envp[]={"PATH=/tmp","USER=liyuge",NULL};//设定新的环境变量,注意使用NULL结尾int execve(const char *path, char *const argv[], char *const envp[])

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char *argv[])
{//char * const envp[] = {"AA=11", "BB=22", NULL};printf("Entering main ...\n");int ret;ret =execl("./hello", "hello", NULL);//execle("./hello", "hello", NULL, envp);if(ret == -1)perror("execl error");printf("Exiting main ...\n");return 0;
}

二、进程
2.1  fork()函数
 函数fork()

    所需头文件:#include<sys/types.h>

                        #include<unistd.h>

    函数原型:pid_t fork()

    函数参数:无

    函数返回值:

          0    子进程

        >0    父进程,返回值为创建出的子进程的PID

         -1    出错

以发现子进程和父进程之间并没有对各自的变量产生影响。

一般来说,fork之后父、子进程执行顺序是不确定的,这取决于内核调度算法。进程之间实现同步需要进行进程通信

vfork与fork对比:

相同:

返回值相同

不同:

fork创建子进程,把父进程数据空间、堆和栈复制一份;vfork创建子进程,与父进程内存数据共享;

vfork先保证子进程先执行,当子进程调用exit()或者exec后,父进程才往下执行

为什么需要vfork?

因为用vfork时,一般都是紧接着调用exec,所以不会访问父进程数据空间,也就不需要在把数据复制上花费时间了,因此vfork就是”为了exec而生“的。

结束子进程的调用是exit()而不是return,如果你在vfork中return了,那么,这就意味main()函数return了,注意因为函数栈父子进程共享,所以整个程序的栈就跪了。

2.2 exec函数族
————————————————
版权声明:本文为CSDN博主「Egozjuer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42494287/article/details/96134339

TCP/IP,父进程fork产生的子进程变成僵尸进程,僵尸进程产生原因,查看方法,关闭父进程回收僵尸子进程,代码中回收子进程函数wait,waitpid_父子进程间的通信出现僵尸进程怎么处理?-CSDN博客

关于僵死进程的产生原因以及解决方案_进程僵死-CSDN博客
 

一、僵尸进程产生原因:
1、子进程return。
2、子进程exit。
3、父进程没return或exit,父进程没有主动请求获取子进程的返回值。

二、查看僵尸进程的方法:
ps au
看运行状态是Z+的进程,就是zombie进程。

僵尸进程的解决方法:关闭父进程,或者在父进程中调用后面的函数wait和waitpid。

*三、wait函数,父进程主动获取某个结束的子进程的返回值。
pid_t wait(int wstatus);
返回值是子进程的pid,wstatus是子进程的返回值信息,如果父进程调用wait时没有子进程结束,父进程就会阻塞blocking并等到有子进程结束,获取子进程的信息。

*四、waitpid函数
pid_t waitpid(pid_t pid, int wstatus, int options);
pid是等待回收的子进程的pid,如果传入-1,可以等任意子进程终止。
wstatus等价于wait中的wstatus,用来看终止信息和返回信息的。
options传递头文件sys/wait.h中声明的常量WNOHANG,这个参数可以让当前没有已返回的子进程时,父进程不会阻塞,而是会返回0然后退出函数。

五、两个宏对wstatus的返回值信息进行判断,获取子进程的结束状况和返回值。
WIFEXITED(wstatus)可以返回子进程的终止信息,子进程正常终止时返回true
WEXITSTATUS(wstatus)可以返回子进程的返回值

调用wait函数回收子进程后都要对子进程的终止信息进行判断并做上日志。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<assert.h>
void fun(int sign)
{pid_t pid=wait(NULL);printf("fun=%d\n",pid);//打印子进程到pid}
int main()
{signal(SIGCHLD,fun);//子进程结束时会给父进程发送SIGCHLD这个信号,接受到以后父进程调用fun函数,在fun函数中调用wait()给子进程收尸。pid_t pid=fork();//创建子进程assert(pid!=-1);if(pid==0)//子进程{printf("child start\n");sleep(5);printf("child end\n");}else//父进程{printf("father start\n");sleep(10);//为了使僵死进程出现所以父进程晚结束sleep(3);//为了给大家截图看状态,后面会有讲解printf("father end\n");}
}

大家看代码知道父进程中睡眠10s,子进程中睡眠5s,5s后子进程结束会给父进程发SIGCHLD信号,父进程接受到信号会被唤醒执行fun()方法调用wait()给子进程收尸,那大家是不是有个问题,父进程本来睡10s但是睡了5s被子进程打断,唤醒去调用了fun(),那不是还有5s的睡眠时间吗?要不要把剩下的5s睡完,答案是不需要,因为运行过程就是执行代码的过程,sleep(10)这行代码已经执行过了,至于效果那就是另一回事,所以父进程下一步做的是执行下一行代码sleep(3),为了给大家截上面的图反映看父子进程的状态,所以让他睡眠3s来打印出此时子进程还在不在进程表中。
现在大家应该理解僵死进程的产生以及解决了吧

fork和exec一起使用

https://www.cnblogs.com/liyou-blog/p/5089279.html

/************************************************************************** File: a.cpp* Brief: * Created Time: Wed 23 Dec 2015 08:50:13 AM CST************************************************************************/#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<signal.h>
using namespace std;#define Sleep(ms) usleep(ms * 1000)int main(int argc,char* argv[])
{printf("pid=%d, ",getpid());for(int i=0; i<argc;i++)printf("[%d]=%s, ",i,argv[i]);printf("\n");struct sigaction sigchld_action;sigchld_action.sa_handler = SIG_DFL;sigchld_action.sa_flags = SA_NOCLDWAIT;sigaction(SIGCHLD, &sigchld_action, NULL);//new processint m_subProcessID=fork(); if (m_subProcessID==0){int ret=execl("./slave.out","a=abc","b=def","c=12345",NULL);if(0!=ret){printf("execl fails.\n");return -1;}printf("execl done wit ok\n");return 0;}for(int i=0;i<10;i++){Sleep(2000);printf("master say: i=%d\n",i);}printf("master say: i am done\n");return 0;
}

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

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

相关文章

MAX/MSP SDK学习01:Object的基本构成、创建销毁行为函数的定义、属性的赋值、以及相关注意事项

Object的基本构成、创建&销毁&行为函数的定义、属性的赋值、以及相关注意事项。 #include "ext.h" // standard Max include, always required #include "ext_obex.h" // required for new style Max object// object struct&#xff0c;定义属…

G管螺纹尺寸对照表

G管螺纹尺寸对照表 NPT 是 National (American) Pipe Thread 的缩写&#xff0c;属于美国标准的 60 度锥管螺纹&#xff0c;用于北美地区&#xff0e;国家标准可查阅 GB/T12716-1991 PT 是 Pipe Thread 的缩写&#xff0c;是 55 度密封圆锥管螺纹&#xff0c;属惠氏螺纹家族&a…

微服务学习|Gateway网关:网关作用、快速入门、路由断言工厂、路由过滤器配置、全局过滤器、过滤器执行顺序、跨域问题处理

为什么需要网关 网关功能: 1.身份认证和权限校验 2.服务路由、负载均衡 3.请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种:gateway、zuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SprinaCloudGateway则是基于Spring5中提供的WebFlux&#xf…

最新PS 2024 虎标正式版来啦,附带AI神经滤镜(支持win/mac)

软件简介 文件名称 PS2024 虎标正式版 支持系统 windows、Mac 获取方式 文章底部 分享形式 百度网盘 小伙伴们&#xff0c;下午好&#xff01;今天给大家的是PS 2024 25.0虎标正式版。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释…

机器学习介绍与分类

随着科学技术的不断发展&#xff0c;机器学习作为人工智能领域的重要分支&#xff0c;正逐渐引起广泛的关注和应用。本文将介绍机器学习的基本概念、原理和分类方法&#xff0c;帮助读者更好地理解和应用机器学习技术。 一、机器学习的基本概念 机器学习是一种通过从数据中学…

了解一下公网IP和域名的区别与联系

​  公网IP和域名是互联网中两个重要的概念&#xff0c;它们在网络通信和网站访问中起着不同的作用。 我们来了解一下公网IP。公网IP是指在全球范围内唯一的IP地址&#xff0c;用于标识互联网上的设备。每个设备连接到互联网时都会被分配一个公网IP地址&#xff0c;这个地址可…

人机交互——自然语言生成

自然语言生成是让计算机自动或半自动地生成自然语言的文本。这个领域涉及到自然语言处理、语言学、计算机科学等多个领域的知识。 1.简介 自然语言生成系统可以分为基于规则的方法和基于统计的方法两大类。基于规则的方法主要依靠专家知识库和语言学规则来生成文本&#xff0…

MySQL之JDBC编程

目录 1. 数据库编程的必备条件 2. Java的数据库编程&#xff1a;JDBC 3. JDBC工作原理 4. JDBC使用 4.1 IDEA配置JDBC 4.2 JDBC开发案例 4.3 JDBC使用步骤总结 5. JDBC常用接口和类 5.1 JDBC API 5.2 数据库连接Connection 5.3 Statement对象 5.4 ResultS…

电脑便签功能在哪里找?电脑桌面便签怎么添加?

很多上班族在使用电脑办公的时候&#xff0c;都需要随手记录工作事项&#xff0c;例如记录共同工作时的想法、会议笔记、常用工作资料、每天待办的工作任务等事项&#xff0c;这时候使用纸质的笔记本来记录工作&#xff0c;不仅不方便随时查看和使用&#xff0c;而且在修改、删…

HarmonyOS ArkTSTabs组件的使用(六)

Tabs组件的使用 ArkUI开发框架提供了一种页签容器组件Tabs&#xff0c;开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器Tabs的形式多种多样&#xff0c;不同的页面设计页签不一样&#xff0c;可以把页签设置在底部、顶部或者侧边。 Tabs组件的简单使用 Tabs组件…

报错注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1"&#xff0c;页面均回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…

mac 和 windows 相互传输文件【共享文件夹】

文章目录 前言创建共享文件夹mac 连接共享文件夹 前言 温馨提示&#xff1a;mac 电脑和 windows 电脑必须处于同一局域网下 本文根据创建共享文件夹的方式实现文件互相传输&#xff0c;所以两台电脑必须处于同一网络 windows 创建共享文件夹&#xff0c;mac 电脑通过 windows…

C++11新特性 变参模板、完美转发和emplace

#include <iostream> #include <vector> #include <deque> #include <list> #include <algorithm> using namespace std;class student { public:student() {cout << "无参构造函数被调用!" << endl;}student(int age, st…

PyQt(学习笔记)

学习资料来源&#xff1a; PyQt快速入门——b站王铭东老师 PyQt官网的所有模块 C具体实现的官方文档 PyQt&#xff08;学习笔记&#xff09; PyCharm环境准备运行第一个程序QPushButtonQLabelQLineEdit调整窗口大小、位置、图标布局信号与槽PyQt引入多线程 PyCharm环境准备 新…

yum 搭建仓库 http/ftp

目录 http ftp http 服务端 1. 下载 httpd 服务&#xff0c;记得将防火墙和安全终端全部关掉 2. 开启 httpd 服务 3. 临时挂载 客户端 1. 下载 httpd 服务&#xff0c;记得将防火墙和安全终端全部关掉 2. 开启 httpd 服务 3. 进入 /etc/yum.repos.d 4. 新建一个目录 mhy&…

新零售数字化系统提供商怎么选择?2023十大收银系统排行榜-亿发

随着零售业务的日益繁荣和电子商务的迅猛发展&#xff0c;零售收银系统已成为各类商家提高效率、管理库存、提供更好服务的不可或缺的工具。然而&#xff0c;在众多的收银系统中&#xff0c;如何选择一款适合自己的&#xff0c;一直是许多商家头疼的问题。今天我们就来盘点一下…

用Auth Analyzer插件批量测试接口越权,安全测试快人一步!

随着信息化技术的不断发展&#xff0c;软件安全成了软件行业的重大挑战&#xff0c;因此安全测试也成为了测试人员必备的技能之一。 沐沐在安全测试过程中较为常见的就是接口越权漏洞&#xff0c;在尝试过多种工具进行越权漏洞测试后&#xff0c;最终找到了个人认为最便捷最有…

网络连接Android设备

参考&#xff1a;https://blog.csdn.net/qq_37858386/article/details/123755700 二、网络adb调试开启步骤 1、把Android平板或者手机WiFi连接到跟PC机子同一个网段的网络&#xff0c;在设置-系统-关于-状态 下面查看设备IP,然后查看PC是否可以ping通手机的设备的IP。 2、先…

MAVEN——PACKAGE、INSTALL、DEPLOY的联系与区别

我们在用maven构建java项目时&#xff0c;最常用的打包命令有mvn package、mvn install、deploy&#xff0c;这三个命令都可完成打jar包或war&#xff08;当然也可以是其它形式的包&#xff09;的功能&#xff0c;但这三个命令还是有区别的。下面通过分别执行这三个命令的输出结…

重磅解读 | 阿里云 云网络领域关键技术创新

云布道师 10 月 31 日&#xff0c;杭州云栖大会&#xff0c;阿里云技术主论坛带来了一场关于阿里云主力产品与技术创新的深度解读&#xff0c;阿里云网络产品线负责人祝顺民带来《云智创新&#xff0c;网络随行》的主题发言&#xff0c;针对阿里云飞天洛神云网络&#xff08;下…