exec函数族

1、exec函数族作用

  • 让父子进程执行不相干的操作。
  • 能够替换进程地址空间中的源代码.txt段
  • 当前程序中调用另外一个应用程序(首先想到exec之前需要fork)
  • 返回值:如果函数执行成功,不返回,执行失败,打印错误信息,退出当前进程

2、exec库函数

  • execl(默认传递了环境变量)

函数原型如下:

int execl(const char *path, const char *arg, ...);
path:替换程序的路径。
arg:文件名称。
... :可变参数
注意:该函数的参数是可变的,因此在参数输入完之后需以(char*)0结束

示例:

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

int main()
{
    printf("pid = %d\n",getpid());
    execl("/bin/ps","ps","-f",(char*)0);

    return 0;
}
  • execlp(不用传路径,程序在标准位置)

函数原型如下:

int execlp(const char *file, const char *arg, ...);
file:要加载程序的名称。
arg:文件名称。
...  :可变参数。
注意:标准目录一般指/bin目录,bin目录存放的是可执行程序。
不过具体情况根据环境变量而定,可以通过环境变量来设置其他的标准目录。
因此也可以理解为根据环境变量来加载可执行程序。

示例:

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

int main()
{
    execlp("ls","ls","-lah",(char *)0);//因为ls在标准目录(/bin),因此不用输入路径
    return 0;
}
  • execle(显示传递环境变量)

首先我们了解一下环境变量:

   环境变量指的是一组值,从用户登录后就一直存在,很多应用程序需要依靠它来确定系统的一些细节,我们最常见的环境变量是PATH,它指出了应到哪里去搜索应用程序,如/bin;HOME也是比较常见的环境变量,它指出了我们在系统中的个人目录。环境变量一般以字符串"XXX=xxx"的形式存在,XXX表示变量名,xxx表示变量的值。

下面是我们常见的main函数的函数原型:

int main(int argc, char *argv[], char *envp[]);
argc:参数个数
argv:参数内容
envp:环境变量

execle函数原型如下:

int execle(const char *path, const char *arg, ..., char * const envp[]);
envp 存放环境变量的指针数组

示例:

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

int main(int argc, char *argv[], char *envp[])
{
    execle("/bin/ls","ls","-lah", (char *)0, envp);
    return 0;
}
  • execv(将参数存入数组进行传递)

函数原型:

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

示例:

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

int main()
{
    char *argv[] = {"ps","-f",(char *)0};
    execv("/bin/ps",argv);
    return 0;
}
  • execvp(不用传路径 + 将参数存入数组进行传递)

函数原型:

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

示例:

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

int main()
{
    char *argv[] = {"ps","-f",(char *)0};
    execvp("ps",argv);
    return 0;
}
  • 系统调用execve(路径 + 参数(数组) + 环境变量(数组))

上面的五个exec函数是库函数,这个是系统函数;上面的五个exec函数最终都是调用这个函数实现的。 

函数原型:

int  execve(const  char  *filename, char *const argv[], char *const envp[]);

示例:

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

int main(int argc, char *argv[], char *envp[])
{
    char *argvv[] = {"ps","-f",(char *)0};//argvv不同于main函数中的参数列表argv
    execve("/bin/ps",argvv,envp);
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值