exec函数簇

exec一共有六种函数,都是以exec开头。

1 int execl(const char *path, const char *arg, ...);
2 int execlp(const char *file, const char *arg, ...);
3 int execle(const char *path, const char *arg, ..., char * const envp[]);
4 int execv(const char *path, char *const argv[]);
5 int execvp(const char *file, char *const argv[]);
6 int execve(const char *path, char *const argv[], char *const envp[]);
后缀 含义
l l代表list,接受以逗号的参数,最后是以(char *)0结束。
v v代表vector,接受参数数组,数组以NULL结束。
p p代表取用PATH环境环境寻找可执行文件,不需要单独传入一个路径参数。
e 取代当前的环境环境

主程序

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <sys/wait.h>
 4 #include <errno.h>
 5 extern char **environ;
 6 int main(){
 7     char *env[]={"USER=hh","PATH=/home/map/users",NULL};
 8     int pid;
 9     if((pid=fork())<0){
10         perror("fork error;");
11     }else if(pid==0){
12         execle("/home/map/users/maxin/cpp/chr08/test","test","hello","world",(char *)0,env);
13         perror("exec error:");
14     }
15     if(waitpid(pid,NULL,0)!=pid){
16         perror("wait error");
17     }
18     printf("----------------------------------------\n");
19     if((pid=fork())<0){
20         perror("fork error;");
21     }else if(pid==0){
22         execle("/home/map/users/maxin/cpp/chr08/test","test","hello","world",(char *)0,environ);
23         perror("exec error:");
24     }
25     if(waitpid(pid,NULL,0)!=pid){
26         perror("wait error");
27     }
28
29     printf("----------------------------------------\n");
30     if((pid=fork())<0){
31         perror("fork error;");
32     }else if(pid==0){
33         execlp("./test","./test","hello",(char *)0);
34         perror("exec error:");
35     }
36     if(waitpid(pid,NULL,0)!=pid){
37         perror("wait error");
38     }
39 }

被调用的程序

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 extern char **environ;
 4 void showEnv();
 5 int main(int args,const char *argv[]){
 6     printf("args%d\n",args );
 7     for(int i=0;i!=args;++i){
 8         printf("argv[%d]:%s\n",i,argv[i]);
 9     }
10     printf("USER:%s\n", getenv("USER"));
11     printf("PATH:%s\n", getenv("PATH"));
12     showEnv();
13 }
14 void showEnv(){
15     int i=0;
16     while(environ[i]){
17         printf("environ[%d]:%s\n",i,environ[i] );
18         ++i;
19     }
20     printf("----------------------END---------------------------\n" );
21 }

最后的显示结果

args3
argv[0]:test
argv[1]:hello
argv[2]:world
USER:hh
PATH:/home/map/users
environ[0]:USER=hh
environ[1]:PATH=/home/map/users
----------------------END---------------------------
----------------------------------------
args3
argv[0]:test
argv[1]:hello
argv[2]:world
USER:map
PATH:/home/tools/tools/svn/1.6.5/64/bin:/home/tools/tools/scmtools/usr/bin:/home/tools/tools/../bin/64/:/home/tools/tools/maven/apache-maven-2.2.0/bin:/home/tools/tools/ant/apache-ant-1.6.5/bin:/home/tools/tools/ant/apache-ant-1.7.1/bin:/home/tools/tools/php/5.2.17/64/bin:/java/jdk1.6.0_06/bin:/java/jdk1.6.0_06/jre/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/share/*****/bin:/opt/bin:/home/opt/bin:/home/map/bin:/home/work/.nlpcloud/nlpc/bin:/home/work/.qu/qu:/home/map/bin:/home/map/users/yinsongyang/fis/node-v0.10.26-linux-x64/bin:/home/map/users/yinsongyang/fis/jre1.7.0_55/bin:/home/map/odp24/php/bin
environ[0]:MAC=64
environ[1]:MANPATH=:/tools/*****_manpage/man
environ[2]:HOSTNAME=cq01-rdqa-*****.*****.*****.com
environ[3]:TERM=vt100
environ[4]:SHELL=/bin/bash
environ[5]:HISTSIZE=1000
environ[6]:SSH_CLIENT=172.22.4.13 36038 22
environ[7]:OLDPWD=/home/map/users/maxin/cpp
environ[8]:MAVEN_2_2_1=/home/tools/tools/maven/apache-maven-2.2.1/bin
environ[9]:SSH_TTY=/dev/pts/2
environ[10]:MAVEN_3_0_4=/home/tools/tools/maven/apache-maven-3.0.4/bin
environ[11]:ANT_HOME=/home/tools/tools/ant/apache-ant-1.6.5
environ[12]:USER=map
environ[13]:LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
environ[14]:MAIL=/var/spool/mail/map
environ[15]:PATH=/home/tools/tools/svn/1.6.5/64/bin:/home/tools/tools/scmtools/usr/bin:/home/tools/tools/../bin/64/:/home/tools/tools/maven/apache-maven-2.2.0/bin:/home/tools/tools/ant/apache-ant-1.6.5/bin:/home/tools/tools/ant/apache-ant-1.7.1/bin:/home/tools/tools/php/5.2.17/64/bin:/java/jdk1.6.0_06/bin:/java/jdk1.6.0_06/jre/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/share/*****/bin:/opt/bin:/home/opt/bin:/home/map/bin:/home/work/.nlpcloud/nlpc/bin:/home/work/.qu/qu:/home/map/bin:/home/map/users/yinsongyang/fis/node-v0.10.26-linux-x64/bin:/home/map/users/yinsongyang/fis/jre1.7.0_55/bin:/home/map/odp24/php/bin
environ[16]:INPUTRC=/etc/inputrc
environ[17]:PWD=/home/map/users/maxin/cpp/chr08
environ[18]:JAVA_HOME=/java/jdk1.6.0_06
environ[19]:LANG=en_US
environ[20]:JAVA_HOME_1_6=/home/tools/tools/java/jdk1.6.0_20
environ[21]:JAVA_HOME_1_5=/home/tools/tools/java/jdk1.5.0_07
environ[22]:ANT_HOME_1_7=/home/tools/tools/ant/apache-ant-1.7.1
environ[23]:SHLVL=1
environ[24]:HOME=/home/map
environ[25]:LOGNAME=map
environ[26]:CLASSPATH=:/java/jdk1.6.0_06/lib:/java/jdk1.6.0_06/jre/lib
environ[27]:SSH_CONNECTION=172.22.4.13 36038 10.48.52.44 22
environ[28]:PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:
environ[29]:LESSOPEN=|/usr/bin/lesspipe.sh %s
environ[30]:G_BROKEN_FILENAMES=1
environ[31]:_=./a.out
----------------------END---------------------------
----------------------------------------
args2
argv[0]:./test
argv[1]:hello
USER:map
PATH:/home/tools/tools/svn/1.6.5/64/bin:/home/tools/tools/scmtools/usr/bin:/home/tools/tools/../bin/64/:/home/tools/tools/maven/apache-maven-2.2.0/bin:/home/tools/tools/ant/apache-ant-1.6.5/bin:/home/tools/tools/ant/apache-ant-1.7.1/bin:/home/tools/tools/php/5.2.17/64/bin:/java/jdk1.6.0_06/bin:/java/jdk1.6.0_06/jre/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/share/*****/bin:/opt/bin:/home/opt/bin:/home/map/bin:/home/work/.nlpcloud/nlpc/bin:/home/work/.qu/qu:/home/map/bin:/home/map/users/yinsongyang/fis/node-v0.10.26-linux-x64/bin:/home/map/users/yinsongyang/fis/jre1.7.0_55/bin:/home/map/odp24/php/bin
environ[0]:MAC=64
environ[1]:MANPATH=:/tools/*****_manpage/man
environ[2]:HOSTNAME=cq01-rdqa-*****.*****.*****.com
environ[3]:TERM=vt100
environ[4]:SHELL=/bin/bash
environ[5]:HISTSIZE=1000
environ[6]:SSH_CLIENT=172.22.4.13 36038 22
environ[7]:OLDPWD=/home/map/users/maxin/cpp
environ[8]:MAVEN_2_2_1=/home/tools/tools/maven/apache-maven-2.2.1/bin
environ[9]:SSH_TTY=/dev/pts/2
environ[10]:MAVEN_3_0_4=/home/tools/tools/maven/apache-maven-3.0.4/bin
environ[11]:ANT_HOME=/home/tools/tools/ant/apache-ant-1.6.5
environ[12]:USER=map
environ[13]:LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
environ[14]:MAIL=/var/spool/mail/map
environ[15]:PATH=/home/tools/tools/svn/1.6.5/64/bin:/home/tools/tools/scmtools/usr/bin:/home/tools/tools/../bin/64/:/home/tools/tools/maven/apache-maven-2.2.0/bin:/home/tools/tools/ant/apache-ant-1.6.5/bin:/home/tools/tools/ant/apache-ant-1.7.1/bin:/home/tools/tools/php/5.2.17/64/bin:/java/jdk1.6.0_06/bin:/java/jdk1.6.0_06/jre/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/share/*****/bin:/opt/bin:/home/opt/bin:/home/map/bin:/home/work/.nlpcloud/nlpc/bin:/home/work/.qu/qu:/home/map/bin:/home/map/users/yinsongyang/fis/node-v0.10.26-linux-x64/bin:/home/map/users/yinsongyang/fis/jre1.7.0_55/bin:/home/map/odp24/php/bin
environ[16]:INPUTRC=/etc/inputrc
environ[17]:PWD=/home/map/users/maxin/cpp/chr08
environ[18]:JAVA_HOME=/java/jdk1.6.0_06
environ[19]:LANG=en_US
environ[20]:JAVA_HOME_1_6=/home/tools/tools/java/jdk1.6.0_20
environ[21]:JAVA_HOME_1_5=/home/tools/tools/java/jdk1.5.0_07
environ[22]:ANT_HOME_1_7=/home/tools/tools/ant/apache-ant-1.7.1
environ[23]:SHLVL=1
environ[24]:HOME=/home/map
environ[25]:LOGNAME=map
environ[26]:CLASSPATH=:/java/jdk1.6.0_06/lib:/java/jdk1.6.0_06/jre/lib
environ[27]:SSH_CONNECTION=172.22.4.13 36038 10.48.52.44 22
environ[28]:PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:
environ[29]:LESSOPEN=|/usr/bin/lesspipe.sh %s
environ[30]:G_BROKEN_FILENAMES=1
environ[31]:_=./a.out
----------------------END---------------------------

exec函数簇

时间: 2024-10-13 04:46:11

exec函数簇的相关文章

exec函数簇理解

在Linux中进程要使用exec函数族来启动另一个程序的执行.系统调用execve()对当前进程进行替换,替换者为一个指定的程序,其参数包括文件名(filename).参数列表(argv)以及环境变量(envp).exec函数族当然不止一个,但它们大致相同,在 Linux中,它们分别是:execl,execlp,execle,execv,execve和execvp,下面我只以execlp为例,其它函数究竟与execlp有何区别,请通过manexec命令来了解它们的具体情况. 一个进程一旦调用ex

fork和exec函数

#include<unistd.h> pid_t fork(void); 返回:在子进程中为0,在父进程中为子进程IO,若出错则为-1 fork最困难之处在于调用它一次,它却返回两次.它在调用进程(称为父进程)中返回一次,返回值是新派生进程(称为子进程)的进程ID号:在子进程中又返回一次,返回值为0.因此,返回值本身告知当前进程是子进程还是父进程. fork在子进程返回0而不是父进程的进程ID的原因在于:任何子进程只有一个父进程,而子进程总是可以通过getppid取得父进程的进程ID.相反,父

JS中exec函数与match函数的区别与联系

总结: 正则规则的声明,两种方法: exec是RegExp类的匹配方法 match是字符串类的匹配方法 var reg = /aaa/g; var reg = new RegExp("aaa","g"); 创建的时候 可以用 这两种方法创建,唯一的区别在于 第二种 用NEW的方法可以在规则内使用变量,例如 var name="xaiohua"; var reg=new RegExp("aa"+xiaohua+"aa&

一、进程与信号之exec函数system函数

exec函数: 子进程调用exec函数执行另一个程序,exec函数进程完全由新程序代替,替换原有程序正文,数据,堆,栈段 #include <unistd.h> extern char **environ; int execl(const char *path,const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path,const char *arg

Linux系统编程_9_进程控制之exec 函数

exec函数 当进程调用exec函数时,该进程的执行程序完全的替换为新程序.新程序从它的main函数开始执行: 使用fork函数创建一个子进程后,子进程往往会使用exec函数去执行另一个程序. 注意:调用exec函数并不会创建新进程,所以创建前后的进程ID不会改变,exec只是用一个全新的程序替换了当前正在运行的程序的代码段.数据段.堆.栈. #include <unistd.h> extern char **environ; int execl(const char *path, const

让QMainWindow也表现出QDialog的exec函数的特征

前几天在做毕业设计项目的时候,使用的PyQt4,想实现这么样一个功能: 场景描述:主窗口a(QMainWindow类型)和主窗口b(QMainWindow),b是通过a窗口中某一个按钮弹出来的. 功能:b窗口弹出来之后a窗口不能进行任何操作 实现方法: 用过Qt的同学应该很清楚,如果是QDialog类型的话,这个功能是很容易实现的,只需要通过QDialog的exec函数就可以阻塞原窗口,但是QMainWindow是没有这样的函数的,但是我们可以怎样实现呢? 方法1:重现QMainWindow的实

JavaScript中exec函数

JavaScript中exec函数是用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组.使用实例: rgExp.exec(str) 其中rgExp是必选项.包含正则表达式模式和可用标志的正则表达式对象. str是必选项.要在其中执行查找的 String 对象或字符串文字.http://www.120hrb.com 如果 exec 方法没有找到匹配,则它返回 null.如果它找到匹配,则 exec 方法返回一个数组,并且更新全局 RegExp 对象的属性,以反映匹配结果.数组的0元

exec*函数对应的系统调用处理过程

“casualet + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” exec*函数对应的系统调用会加载可执行程序到内存进行执行.本文将分析可执行程序加载的过程,包括可执行程序的个是ELF,动态链接以及静态链接相关内容,并通过gdb调试的方式展示该系统调用的执行过程.

WScript.Shell对象的 run()和exec()函数使用详解

http://blog.sina.com.cn/s/blog_6e14a2050102v47g.html vbScript 中 WScript.Shell 对象的 run 和 exec 函数功能使用详解 函数声明: Set Ws = CreateObject("Wscript.Shell")    Function Exec(ByVal Command As String) As WshExec    Function Run(ByVal Command As String, [ByV