`
king_tt
  • 浏览: 2259143 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux多任务编程(三)---exec函数族及其基础实验

阅读更多

exec函数族

函数族说明

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

在 Linux 中使用exec函数族主要有两种情况:

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

●如果一个进程想执行另一个程序,那么它就可以调用 fork() 函数新建一个进程,然后调用 exec 函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。

函数族语法

实际上,在Linux中并没有exec()函数,而是由6个以 exec 开头的函数,它们之间的语法有细微差别。下表列出了 exec 函数族的6个成员函数的语法:

这6个函数在函数名和使用语法的规则上都有细微的区别,下面就从可执行文件查找方式、参数传递方式和环境变量这几个方面进行比较。

● 查找方式:表1中的前4个函数的查找方式都是完整的文件目录路径,而最后两个函数(也就是以 p 结尾的两个函数)可以只给出文件名,系统就会自动按照环境变量“$PATH” 所指定的路径进行查找。

● 参数传递方式:exec函数族的参数传递有两种:一种是逐个列举的方式,而另一种则是将所有参数整体构造指针数组传递。在这里是以函数名的第5位字母来区分的,字母为 "l"(list)的表示逐个列举参数的方式,其语法为const char *arg;字母为“v”(vector)的表示将所有参数整体构造指针数组传递,其语法为 char *const argv[]。这里的参数实际上就是用户在使用这个可执行文件时所需的全部命令选项字符串(包括该可执行程序命令本身)。要注意的是,这些参数必须以NULL结束。

● 环境变量: exec函数族可以默认系统的环境变量,也可以传入指定的环境变量。这里以 “e”(environment)结尾的两个函数 execle()和 execve()就可以在 envp[]中指定当前进程所使用的环境变量。

表2再对这6个函数中的函数名和对应语法做了一个小结,主要指出了函数名中每一位对应所表明的含义,以此表加以记住这6个函数。

事实上,这6个函数中真正的系统调用只有execve(),其他5个都是库函数,它们最终都会调用execve()这个系统调用。在使用exec函数族时,一定要加上错误判断语句。exec 很容易执行失败,其中最常见的原因有:

① 找不到文件或路径,此时 errno 被设置为 ENOENT。

② 数组argv 和envp 忘记用NULL结束,此时,errno被设置为 EFAUL。

③ 没有对应可执行文件的运行权限,此时 errno 被设置为EACCES。

基础实验

实验1

本实验是为了说明如何使用文件名来查找可执行文件,同时使用参数列表的方式。这里用的函数是 execlp()。程序代码如下:

在该程序中,首先使用 fork()函数创建一个子进程,然后在子进程中使用 execlp()函数。可以看到,这里的参数列表列出了在 shell 中使用的命令名和选项,并且当使用文件名进行查找时,系统会在默认的环境变量PATH中寻找该可执行文件。

使用命令:gcc execlp.c -o execlp编译后,然后再执行,结果如下图:

使用env命令,可以查看到环境变量的路径名

此程序的执行结果与在shell中直接输入命令“ps -ef”是一样的,当然,在不同系统的不同时刻可能会有不同的结果。

实验2

本实验实现的功能和实验1的一样,不同的是使用的函数不同。本实验将使用完整的文件目录来查找对应的可执行文件。注意,目录必须以“/”开头,否则将其视为文件名。程序代码如下:

编写保存源文件,然后使用命令:gcc execl.c -o execl编译,接着执行命令:./execl,可以看到实验结果和实验1一样

实验3

本实验是利用execle()函数将环境变量添加到新建的子进程中,这里的“env”是查看当前进程环境变量的命令,实验代码如下:

编写保存源文件后,使用命令:gcc execle.c -o execle,再执行命令:./execle,执行结果如下图

实验4

本实验实现功能和实验3一样,不同的是使用的execve()函数,通过构造指针数组的方式来传递参数,注意参数列表一定要以NULL作为结尾标识符,实验代码如下:

编写保存源文件,使用命令:gcc execve.c -o execve,再执行命令:./execve,结果如下:

 

到此关于进程的执行实验完毕,下一节学习进程的终止

分享到:
评论

相关推荐

    迅为出品---iTOP-4412开发板之Linux实验手册-ARM开发板资料.pdf

    该手册分为多个实验,从基础的“Hello World”程序开始,逐步深入到内核驱动、多任务编程、串口通信、文件传输、进程管理等Linux系统的高级功能。以下是手册中所包含实验的知识点概览: 1. 实验一:Hello World。该...

    操作系统 linux下 fork exec wait 函数分析(课程设计)

    这样的设计能模拟多任务执行,理解和掌握这三个函数的用法对理解操作系统进程管理至关重要。 在"200609020111薛强(操作系统课程设计)"的文件中,很可能包含了关于如何结合使用`fork`, `exec`和`wait`进行课程设计...

    iTOP-4412实验手册

    ### iTOP-4412实验手册知识点概览 ...通过以上实验,不仅可以深入了解iTOP-4412开发板的特性和Linux操作系统的基本功能,还能掌握一系列关键的编程技术和技巧,为后续的嵌入式系统开发奠定坚实的基础。

    Linux实验指导书

    通过这个实验,学生将能够熟练地在Linux终端中执行基本任务,为后续的Linux学习打下坚实基础。 实验二:简单Shell程序设计 1、实验目的: 该实验旨在使学生了解Shell脚本编程,理解其基本语法和控制结构,以实现...

    NJUPT GNU/Linux编程课件和代码

    【标题解析】 "NJUPT GNU/Linux编程课件和代码"这个标题表明这是一个与GNU/Linux...通过这份NJUPT的GNU/Linux编程资源,学习者可以全面系统地掌握Linux下的编程技术和实践方法,为成为合格的Linux开发者打下坚实基础。

    LINUX实验程序——————初学者

    4. **系统调用**:描述中提到的“相关的系统编程的函数理解”可能是指Linux中的系统调用,如open()用于打开文件,read()和write()用于文件读写,close()用于关闭文件,还有fork()和exec()用于进程管理。 5. **网络...

    实验2-shell及shell编程.doc

    ### 实验2-shell及shell编程知识点详解 #### 一、实习目的 - **学习 shell 的功能及相关配置文件**: - 了解 shell 的基本概念及其作为 Linux/Unix 系统的用户界面的作用。 - 掌握 `/etc/profile`、`$HOME/.bash...

    Linux并发编程实验(线程、进程).pdf

    但基于标题“Linux并发编程实验(线程、进程)”和描述“Linux并发编程实验(线程、进程)”可以推测,文档可能涉及到Linux系统下进程和线程的概念,以及如何在Linux系统中实现并发编程。下面我将基于这些信息,尽可能...

    操作系统实验linux 实验 课程设计

    在Linux中,可以使用fork()创建新进程,使用exec()系列函数加载新的程序,用wait()和waitpid()等待子进程结束,以及用信号处理函数来处理进程间的同步和通信。在Cygwin下,这些函数同样可用,使得Windows用户能在...

    猪哥的嵌入式linux公房菜

    ### 知识点总结 #### 一、学习指引 **1....- **理论基础**:了解计算机体系结构、操作系统原理等。 - **编程语言**:熟练掌握C/C++,熟悉汇编... Linux系统基础知识(三)基本使用命令** - **常用命令**:ls、cd、cp等。...

    linux 编程基础

    【Linux编程基础】是IT领域的基础知识之一,涵盖了多个关键领域,包括C语言的使用、Shell脚本编写、Linux进程开发、串口编程、Socket编程以及Linux驱动开发。 **C语言的回顾** C语言是由贝尔实验室的Dennis Ritchie...

    linux与unix shell编程指南读书笔记.rar

    Linux与Unix Shell编程指南读书笔记提供了深入理解和熟练掌握Shell脚本编写技巧的宝贵资源。Shell是Linux和Unix操作系统中的命令解释器,它不仅用于交互式地执行命令,还能编写自动化任务的脚本,极大地提高了系统...

    ch09unix-linux编程实践.rar

    学习Bash Shell编程,包括变量、条件语句、循环、函数和重定向等,是理解Unix/Linux系统操作的关键。 三、文件系统与I/O操作 Unix/Linux的文件系统是其核心组件之一。了解文件权限、目录结构、文件操作(如读写、...

    linux编程资料html

    【Linux编程资料HTML】是针对操作系统实验课程设计的一系列课件,主要以HTML格式呈现,适合对Linux系统编程有学习需求的人员。HTML是一种广泛用于网页制作的语言,它提供了丰富的结构化标记,使得内容能够清晰地展示...

    linux进程编程ppt

    Linux提供了一系列系统调用来实现进程控制,如fork()用于创建子进程,exec()系列函数用于替换当前进程的执行上下文,wait()和waitpid()用于父进程等待子进程结束,而kill()和signal()则用于进程间的通信和信号处理。...

    Linux嵌入式系统实验报告.doc

    实验三:shell程序设计Shell编程是Linux系统中编写脚本和自动化任务的重要方式。它允许用户通过命令行接口编写一系列命令,形成一个可执行的脚本。基础概念包括: 1. 变量:用于存储数据,如赋值 `name="John"`。 2...

    Linux应用程序开发实验代码

    3. **进程与线程管理**:Linux中的进程和线程是多任务处理的基础。开发者需要了解如何创建、通信(使用管道、信号量、共享内存等)、同步和结束进程或线程。 4. **系统调用接口**:Linux提供了一个丰富的系统调用...

    linux综合性实验.zip

    8. **Shell脚本编程**:编写简单的Bash脚本,了解变量、条件语句、循环结构以及函数,从而实现自动化任务。 9. **系统日志**:理解`/var/log`目录下的各种日志文件,以及如何使用`less`、`grep`等工具分析日志。 ...

    操作系统实验(linux),多线程管理,多进程管理

    在本实验中,我们将深入探讨Linux操作系统中的两个关键概念:多线程管理和多进程管理。这些概念对于理解和优化系统的性能至关重要,特别是在并发编程和系统资源调度方面。 首先,让我们了解多线程管理。在计算机...

Global site tag (gtag.js) - Google Analytics