`
M_ittrue
  • 浏览: 77006 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

exec系列函数介绍

 
阅读更多

 

    用fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec 函数以执行另一个程序。当进程调用一种exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec 并不创建新进程,所以调用exec 前后该进程的id并未改变。


exec函数可分了两大系列,主要的区别在于命令行参数的传递.

 

execl(const char* path,const char* arg,...);

execlp(const char* file,const char* arg,...);

execle(const char* path,const char* arg,...,const char* envp);


 

execv(const char* path,char*const  argv[],...);

execvp(const char* file,char*const  argv[],...);

execve(const char* path,char*const  argv[],...,const char* envp);


  第一个参数

 无p的函数第一个参数要求的是程序的绝对路径或者相对路径如/bin/sh ,./sh

 有p的函数第一个参数:

 

  1:如果参数中包含/,则将其视为路径名。

  2:否则视为不带路径的程序名,在PATH 环境变量的目录列表中搜索这个程序。

 

第二个可变参数

对于带l的函数可变参数是从左至右参数列表传递,而带v的就如我们的int main(int argc,int* argv[]),的第个参数般,是按指针数组传递的.

 

参数envp是代表环境变量.可以把一份新的环境变量表传给它,其

他exec 函数仍使用当前的环境变量表执行新程序。


 

事实上,只有execve是真正的系统调用,其它五个函数最终都调用execve

exec函数族

一个完整的例子:

#include <unistd.h>
#include <stdlib.h>

int main(void)
{
	execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
	perror("exec ps");
	exit(1);
}

执行此程序则得到:

$ ./a.out 
  PID  PPID  PGRP  SESS TPGID COMMAND
 6614  6608  6614  6614  7199 bash
 7199  6614  7199  6614  7199 ps

由于exec函数只有错误返回值,只要返回了一定是出错了,所以不需要判断它的返回值,直接在后面调用perror即可。注意在调用execlp时传了两个"ps"参数,第一个"ps"是程序名,execlp函数要在PATH环境变量中找到这个程序并执行它,而第二个"ps"是第一个命令行参数,execlp函数并不关心它的值,只是简单地把它传给ps程序,ps程序可以通过main函数的argv[0]取到这个参数。



分享到:
评论

相关推荐

    C例子:exec系列函数

    该程序是我写的博客“一起talk C栗子吧(第一百三十六回:C语言实例--exec系列函数二)”的配套程序,共享给大家使用

    Linux进程控制编程-exec系列函数应用.pdf

    `exec`系列函数是用于替换当前进程映像的关键函数,使得进程能够执行新的程序。本文将深入解析`exec`系列函数的应用,结合提供的代码实例,帮助理解其工作原理和使用方法。 `exec`系列函数包括`execl`、`execle`、`...

    20120618_启动新进程(fork和exec系列函数实现)1

    本文将深入探讨两个重要的函数,`fork()`和`exec()`系列函数,它们在启动新进程时起着至关重要的作用。 **一、复制进程映像:fork()函数** `fork()`函数是Unix和类Unix系统(如Linux)中用于创建新进程的关键系统...

    进程控制 fork函数的使用等

    exec系列函数(如execl)用于在当前进程中替换执行另一个程序。在这个实验中,子进程使用execl调用/bin/sh,这意味着子进程的上下文被shell程序替换,从而执行shell命令。如果成功,exec调用不会返回,因此在execl...

    进程替换:exec 函数族示例代码

    `exec`函数族的基本工作原理是,当一个进程调用`exec`系列函数时,系统不会创建新的进程,而是将当前进程的内存空间清空,然后加载新的程序代码和数据。新程序会继承调用`exec`函数的进程的资源,如文件描述符、环境...

    linux进程之exec函数族.zip

    当`exec`系列函数成功执行时,调用它的进程会被新的程序替代,原进程的内存空间被新程序占用,而原来的程序代码和数据则被替换。 要理解这些示例代码的工作原理,你需要对C语言和Linux系统调用有一定的了解。`execl...

    fork函数使用

    关于fork函数的介绍,和测试程序,原版fork linux平台

    NX二次开发UF-DBC-MLD-exec-command 函数介绍

    NX二次开发UF_DBC_MLD_exec_command 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业...

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

    接着是`exec()`系列函数,如`execl()`, `execv()`, `execle()`, `execvp()`等,它们用于在已经存在的进程空间中加载并执行新的程序。`exec`家族的函数并不会创建新的进程,而是替换当前进程的内存映像,使其运行新的...

    linux进程和线程编程(exec)

    在Linux操作系统中,进程和线程编程是非常重要的概念,exec函数族是Linux中最基本的进程创建函数。exec函数族共有六种调用形式,都是以exec开头,后面的字母表示了用法上的区别。 exec函数族的六种调用形式 1. `...

    php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)

    这时,PHP提供了一系列内置函数,如`exec`、`system`、`passthru`和`escapeshellcmd`,允许我们调用系统命令。然而,这些功能强大的函数同时也伴随着潜在的安全风险,因此在实际应用中需谨慎使用。 `exec`函数用于...

    Linux 进程替换(exec函数)实现代码

    如果`exec`系列函数执行成功,那么当前进程将被新的程序替换,不会继续执行后面的代码。在上述示例中,如果`execve`成功,"child id done"不会被打印出来,因为进程已经被新程序替换。如果`exec`失败,它会返回一个...

    C函数库介绍

    `exec`系列函数用于加载并执行新的程序,例如`execl()`、`execlp()`、`execv()`等,它们都用于替换当前进程的映像,执行指定的路径下的程序。不同之处在于参数的传递方式和是否搜索PATH环境变量。`_exit()`函数则...

    Linux C 函数详解

    此外,针对Linux系统,书中还详细讲解了与系统交互的函数,如fork用于创建子进程,exec系列函数用于执行新的程序,以及socket函数用于网络通信等。这些都是Linux开发中不可或缺的部分,对于理解和编写系统级程序至关...

    c语言va函数讲解.

    此外,exec系列函数在C语言中用于执行外部文件,它们也涉及到可变参数的概念。值得注意的是,main()函数虽然不是典型的va函数,但其参数列表中包含了命令行参数的个数和指针,它也是与可变参数相关的函数。 可变...

    Linux函数详解(函数大全)

    进程控制是Linux系统编程的核心,`fork`函数创建子进程,`exec`系列函数(如`execl`, `execv`, `execle`, `execlp`, `execvp`)则用于替换当前进程的执行映像,加载新的程序。`wait`和`waitpid`用于父进程等待子进程...

    fork、exec系列与system、popen区别.rar_UNIX popen_linux system pop_pop

    在UNIX和Linux操作系统中,进程创建和控制是通过一系列系统调用来实现的,其中最常见的是`fork`、`exec`系列以及`system`和`popen`函数。这些调用各自有不同的特性和用途,理解它们的区别对于进行系统级编程至关重要...

    linux进程函数大全

    在Linux操作系统中,进程是程序执行的实例。...需要注意的是,所有`exec`函数在成功执行后都不会返回,因为它们会替换当前进程而不是创建新的进程。在使用这些函数时,务必确保正确处理错误条件,以免程序意外终止。

    Node.js-native-exec:提供访问POSIXexec*功能的模块

    在Node.js中,通常使用内置的`child_process`模块来执行外部命令,但`native-exec`模块则提供了更直接的方式来访问POSIX(可移植操作系统接口)的`exec*`函数系列,为开发者提供了更为底层的控制权。 POSIX `exec`...

    《LinuxC 函数全集》

    7. **进程和线程管理**:fork用于创建子进程,exec系列函数替换进程地址空间执行新程序。pthread库提供了线程相关的API,如pthread_create创建线程,pthread_join等待线程结束。 8. **信号处理**:signal函数用于...

Global site tag (gtag.js) - Google Analytics