exec函数介绍(整理)(附带:操作系统实验一:进程控制实验 代码)

本文介绍了exec函数族在Linux中的作用,它允许一个进程替换为另一个程序执行,保留进程ID但替换代码段、数据段和堆栈段。文章探讨了exec与fork的结合使用场景,强调exec并未创建新进程,而是替换原有进程上下文。同时,通过示例代码解释了在多进程并发执行中如何正确使用execve,指出在execve之后的代码将不会被执行,需要在父进程中控制子进程的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)exec函数说明

fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。

(2)在Linux中使用exec函数族主要有以下两种情况

当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。

如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。

————————————————
版权声明:上面这段来自CSDN博主「guoping16」的原创文章,遵循 CC 4.0 BY-SA 版权协议,
原文链接:https://blog.csdn.net/guoping16/article/details/6583383

exec和fock简述

exec系统调用从指定程序重新初始化进程,虽然进程还在,但程序已经改变了。

fock系统调用仅通过复制指令、用户数据和系统数据段来创建从现存进程克隆的新进程,该新进程不是从程序初始化得来的,所以旧进程和新进程执行同样的指令。

除启动UNIX内核本身外,exec是程序在UNIX上获得执行的唯一方法,不仅shell使用exec执行程序,而且shell和其祖先shell也会被exec调用。fock是创建新进程的唯一方式。

————————————————
版权声明:上面这段来自CSDN博主「方同学Max」的原创文章,
原文链接:https://blog.csdn.net/csu_max/article/details/38086223

  1. 系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。

一个进程主要包括以下几个方面的内容:

(1)一个可以执行的程序

(2) 与进程相关联的全部数据(包括变量,内存,缓冲区)

(3)程序上下文(程序计数器PC,保存程序执行的位置)

exec是一个函数簇,由6个函数组成,分别是以excl和execv打头的。

执行exec系统调用,一般都是这样,用fork()函数新建立一个进程,然后让进程去执行exec调用。我们知道,在fork()建立新进程之 后,父进各与子进程共享代码段,但数据空间是分开的,但父进程会把自己数据空间的内容copy到子进程中去,还有上下文也会copy到子进程中去。而为了 提高效率,采用一种写时copy的策略,即创建子进程的时候,并不copy父进程的地址空间,父子进程拥有共同的地址空间,只有当子进程需要写入数据时 (如向缓冲区写入数据),这时候会复制地址空间,复制缓冲区到子进程中去。从而父子进程拥有独立的地址空间。而对于fork()之后执行exec后,这种 策略能够很好的提高效率,如果一开始就copy,那么exec之后,子进程的数据会被放弃,被新的进程所代替。
总之,如果你用exec调用,首先应该fork一个新的进程,然后exec
————————————————
版权声明:上面这段来自CSDN博主「smart_yujin」的原创文章,
原文链接:https://blog.csdn.net/smart_yujin/article/details/10515247

说了很多,但自己用的时候还是没有彻底理解execve函数的运用,忘记了它的性质:系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
来看一个例子吧:
示例代码:
要求:
编写一个多进程并发执行程序。父进 程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制 ps 命令总在 ls 命令之前执行。

/*
* Function : 多进程的并发执行
*/

#include "myTest1.h" 

int main(int argc, char *argv[])

{
   

	int i;

	int pid1, pid2; //存放子进程号 

	int status1, status2; //存放子进程返回状态第二部分 操作系统算法实验 

	char *args1[] = {
    "/bin/ls","-a",NULL }; //子进程1要缺省执行的命令 

	char *args2[] = {
    "/bin/ps","-l",NULL }; //子进程2要缺省执行的命令 



	signal(SIGINT, (sighandler_t)sigcat); //注册一个本进程处理键盘中断的函数 

	pid1 = fork(); //建立子进程 1

	if (pid1 < 0) // 建立子进程失败? 

	{
   

		printf<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值