Linux编程基础 3.2:exec函数族

2 exec函数族

使用fork()函数创建的子进程,其中包含的程序代码完全相同,只能根据fork()函数的返回值,执行不同的代码分支。
由exec函数族中的函数,则可以根据指定的文件名或路径,找到可执行文件。

在这里插入图片描述

  • fork:子进程复制父进程的堆栈段和数据段,子进程一旦开始运行,它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再影响
  • exec:一个进程调用exec类函数,它本身就"死亡"了,系统把代码段替换成新的程序代码,废弃原有数据段和堆栈段,并为新程序分配新数据段与堆栈段

exec函数族中包含6个函数,分别为:

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char * const argv[]);
int execvp(const char *file, char * const argv[]);
int execve(const char *path, char * const argv[], char * const envp[]);

参数说明
(1)当参数是path,传入的为路径名;当参数是file,传入的可执行文件名;
(2)可以将exec函数族分为execl和execv两类:

  • execl类:函数将以列举的形式传入参数,由于参数列表的长度不定,所以要用哨兵NULL表示列举结束;
  • execv类:函数将以参数向量表传递参数,char * argv[]的形式传递文件执行时使用的参数,数组中最后一个参数为NULL;

(3)如果没有参数char * const envp[],则采用默认环境变量;如果有,则用传入的参数替换默认环境变量;

  • 在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等
    [root@localhost ~]# env
    ORBIT_SOCKETDIR=/tmp/orbit-root
    HOSTNAME=livecd.centos
    GIO_LAUNCHED_DESKTOP_FILE_PID=2065
    TERM=xterm
    SHELL=/bin/bash

【案例 4】

test_exec.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){pid_t tempPid;tempPid=fork();if(tempPid == -1){   perror("fork error");exit(1);} else if(tempPid > 0) {   printf("parent process:pid=%d\n", getpid());} else {   printf("child process:pid=%d\n", getpid());//execl("/bin/ls","-a","-l","test_exec.c",NULL);	//①//execlp("ls","-a","-l","test_exec.c",NULL);	//②char *arg[]={"-a","-l","test_exec.c", NULL};	//③execvp("ls", arg);perror("error exec\n");printf("child process:pid=%d\n", getpid());} //of if  return 0;
} //of main

3 进程退出

#include <stdlib.h>
void exit(int status);

参数说明
(1)status:表示进程的退出状态,0表示正常退出,非0表示异常退出,一般用-1或1表示;
(2)为了可读性,标准C定义了两个宏:EXIT_SUCCESS和EXIT_FAILURE

Linux系统中有一个与exit()函数非常相似的函数:_exit()

#include <unistd.h>
void _exit(int status);

区别:

  • _exit:系统会无条件停止操作,终止进程并清除进程所用内存空间及进程在内核中的各种数据结构;
  • exit:对_exit进行了包装,在调用_exit()之前先检查文件的打开情况,将缓冲区中的内容写回文件。相对来说exit比_exit更为安全

4 特殊进程

  • 孤儿进程:父进程负责回收子进程,如果父进程在子进程退出之前退出,子进程就会变成孤儿进程,此时init进程将代替父进程完成子进程的回收工作;
  • 僵尸进程:调用exit函数后,该进程不会马上消失,而是留下一个称为僵尸进程的数据结构。它几乎放弃进程退出前占用的所有内存,既没有可执行代码也不能被调度,只是在进程列表中保留一个位置,记载进程的退出状态等信息供父进程回收。若父进程没有回收子进程的代码,子进程将会一直处于僵尸态。

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

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

相关文章

corel产品注册样机安装代码_为你的产品创建一个高逼格的宣传片

大家好&#xff0c;我是独立开发者Larry&#xff5e;当我们的产品或功能发布的时候&#xff0c;一定想要一套高大上的宣传图或宣传视频&#xff0c;不幸的是&#xff0c;由于预算限制、时间排期以及技术门槛等一系列原因&#xff0c;我们不得不降低要求…今天就给大家推荐一个在…

单代号网络图计算例题_如何把横道图转化成双代号网络图?

横道图一般都是用Project或者表格做的&#xff0c;下面就用斑马进度计划软件介绍一下怎么将横道图转化为双代号网络图使用工具&#xff1a;广联达斑马进度计划&#xff0c;点击进入官网下载使用Excel表格绘制的横道图&#xff0c;如何快速转化成网络图打开斑马进度计划软件&…

excel表格不够怎么添加_excel怎么添加筛选

常用的表格处理软件就是excel表格&#xff0c;有时候一些excel上面会有很多不同类型的东西需要筛选以便更能方便寻找&#xff0c;那么excel怎么添加筛选呢&#xff1f;小编跟大家详细介绍。excel怎么添加筛选步骤1&#xff1a;首先&#xff0c;打开一篇你需要选择的Excel步骤2&…

createsemaphore 异常_浅析SPC之异常分析

未来能源的短缺及资源匮乏&#xff0c;导致各国都在寻求替代能源以避免发生无资源可用的情况。汽油替代能源—生质酒精由此得到了广泛的应用。生质酒精属于生质燃料(Biofuel)的一种&#xff0c;是由生物或化学转换成生物质(biomass)而取得的原料。它能够延长零件的使用寿命&…

苹果5越狱教程_unc0ver5.2.0安装方法 iOS13.5用Cydia Impactor或AltStore越狱教程

unc0ver5.2.0是最新更新出来的越狱手机系统&#xff0c;这次的更新不仅仅只是修复了系统的稳定性&#xff0c;大家在更新之后可以支持iOS13.5.5Beta/iOS13.6Beta的使用&#xff0c;所有使用苹果手机的用户想要使用的话可以看下面的详细安装教程&#xff0c;为大家介绍详细的操作…

# 定义四边形_【四边形系列专题】 特殊平行四边形之矩形

点击上方蓝字关注我们【四边形系列专题】特殊平行四边形之矩形TSQ中学数学微信&#xff1a;TSQmaths一、知识网络二、重难突破知识点一 矩形的性质及应用1、定义&#xff1a;有一个角是直角的平行四边形叫做矩形&#xff0e;注意&#xff1a;1、对称性&#xff1a;矩形是轴对称…

xs资料网-产品设计图档下载_proe玩具车3D模型图档下载creo4.0汽车模型下载中磊教育...

现在设计产品的还是有相当一大部分人是用proe造型的&#xff0c;之前我们一直做的是UG的产品造型&#xff0c;今天给大家介绍一款玩具车的3d模型&#xff0c;喜欢的可以下载下载自己研究研究&#xff0c;中磊教育产品设计教程proe玩具车3D模型图档是通过曲面造型所绘制的零件&a…

苹果7手机严重卡顿_分享苹果手机最实用的7个技巧,各个精心挑选,不知道真的太亏了...

使用苹果手机这么久了&#xff0c;你一定也发现了不少好用的功能&#xff0c;今天就来分享苹果手机最实用的7个技巧&#xff0c;每个都是精心挑选&#xff0c;不要错过&#xff0c;总有一个是你需要的。1、 三指操作在编辑文档的时候&#xff0c;三指左滑是撤销(上一步编辑撤销…

如何获取大端中的数据_【软件】ProE中各种获取数据方式的区别

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;软件ProE中各种获取数据方式的区别输入特征&#xff1a;输入特征是通过数据共享功能从外部文件输入几何的&#xff0c;文件输入以后&#xff0c;会转换成proe软件能够识别的几何&#xff0c;称为一个特征发布几何&#…

数字类 default 0和 default 0_全方位的数字规划工具Visual Components 4.0 数字化工厂仿真软件...

Visual Components 是全方位的数字规划工具。无论从制程规划、生产到营销都能够整合在同一个平台上作业&#xff0c;有助于内部的技术沟通及外部营销。此外&#xff0c;Visual Components 整合了物流及机器人模拟功能&#xff0c;帮助企业在研发前期即可进行产能确认&#xff0…

会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...

在现实生活中你是否遇到过这样的情况&#xff0c;笔记本近在咫尺&#xff0c;但你却懒得走到笔记本面前进行操作。当你疲惫地躺在床上时&#xff0c;心里也总是暗想&#xff0c;如果笔记本能够听我的指令跟我对话就好了。工作和生活当中&#xff0c;我们总免不了想要“偷懒”&a…

细粒度图像分类_1.1、 图片分类

记录图像分类论文资源列表。图片分类任务可以分为&#xff1a;粗粒度图片分类、细粒度图片分类。2012 AlexNet &#xff1a;ImageNet Classification with Deep Convolutional Neural Networks。2014 GoogLeNet&#xff1a;Going Deeper with Convolutions。Rethinking the Inc…

AppScan api登录接口 postman_【Postman】12 Postman monitor功能使用

通过前面的文章&#xff0c;我们已经能完成接口的Collection&#xff0c;添加断言&#xff0c;Data文件数据驱动&#xff0c;设置变量&#xff08;Data、Globals和Environment&#xff09;等等方法&#xff0c;对我们的接口进行个各种的测试&#xff0c;保证其正确性。但是还可…

Linux编程基础 5.1:管道

1 简介 Linux进程通信机制&#xff1a; 管道信号量消息队列共享内存socket通信 2 管道 管道其实质是由内核管理的一个缓冲区 形象地认为管道的两端连接着两个进程&#xff1a; 一个进程进行信息输出&#xff0c;将数据写入管道&#xff1b;另一个进程进行信息输入&#xff…

python pd Series 添加行_Python数据分析与挖掘的常用工具

Python语言&#xff1a;简要概括一下Python语言在数据分析、挖掘场景中常用特性&#xff1a;列表(可以被修改)&#xff0c;元组(不可以被修改)字典(结构)集合(同数学概念上的集合)函数式编程(主要由lambda()、map()、reduce()、filter()构成)Python数据分析常用库&#xff1a;P…

Linux编程基础 5.2:消息队列

3 消息队列 消息队列的本质是一个存放消息的链表&#xff0c;该链表由内核来维护。一个消息队列由一个标识符&#xff08;即队列key&#xff09;来标识。消息队列的通信机制传递的数据具有某种结构&#xff0c;而不是简单的字节流&#xff1b;向消息队列中写数据&#xff0c;实…

python tab和空格混用_Python编程常见十大错误,看完你自己都笑了!

关注并置顶【柠檬班】的小哥哥小姐姐胸有成“猪”使用python会出现各种各样的错误&#xff0c;以下是Python常见的错误以及解决方法。01 ValueErrorValueError: ‘Conv2d_1a_33’ is not a valid scope name其实这就是命名错误的问题&#xff0c;如果仔细看“”是我在中文下打的…

升级浏览器_微软IE11浏览器 最后的升级机会

微软IE10浏览器将很快退出支持&#xff0c;许多Windows用户将没有任何安全或非安全更新&#xff0c;免费或付费辅助支持选项或在线技术内容等。幸运的是&#xff0c;微软正在为Windows用户提供升级到IE11的最后机会&#xff0c;目前IE11仅次于Firefox浏览器&#xff0c;这是互联…

jq如何获取选中option的值_【分享】如何获取变量token的值

一.什么是token客户端使用用户名跟密码请求登录服务端收到请求&#xff0c;去验证用户名与密码验证成功后&#xff0c;服务端会签发一个 Token&#xff0c;再把这个 Token 发送给客户端客户端收到 Token 以后可以把它存储起来&#xff0c;比如放在 Cookie 里或者 LocalStorage …

Linux编程基础 6.1:线程操作

1 线程操作 创建线程 挂起线程 终止线程 其它操作 1.1 创建线程 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 功能&#xff1a;创建线程&#xff1b;线程调用pthread_crea…