exec函数用法总结

      在使用exec函数族的时候,经常搞不清楚这六个函数之间的区别,下面就总结一下这六个函数的区别。

    

#include <unistd.h>

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

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

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

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

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

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

     要记住这六个函数之间的区别,就要搞清楚 “l” 、“v”、“p”、“e”代表的含义

    “l”表示参数以列表的形式表示;

    “v”表示参数以数组的形式表示;

    “p”表示在PATH中搜索执行文件;

    “e”表示可附加环境参数。

     execlp、execvp这两个函数第一个形参是名为file表示可以只列出文件名就可以了,不用指出它的路径。

     注意的地方有:

     1、参数以NULL结尾;

     2、exec函数族执行成功后不会返回,执行失败会返回 -1,错误代码存放在errno中

     3、可能的几种错误有,找不到文件或路径,errno为ENOENT;数组argv或envp没有以NULL结尾,errno为EFAULT;没有对执行文件的执行权限,errno为EACCESS;

     照例附加一段测试代码

   

#include <unistd.h>

int main(int argc,char** argv)
{
    char* envp[] = {"PATH=/usr/bin","USER=admin",NULL};
    char* argv_execv[] = {"echo","exec on execv",NULL};
    char* argv_execvp[] = {"echo","exec on execvp",NULL};
    char* argv_execve[] = {"echo","exec on execve",NULL};
    
    if(fork() == 0)
    {   
        if(execl("/bin/echo","echo","execut by execl",NULL) < 0)
        {   
            perror("error on execl");
        }
    }
     
     
    if(fork() == 0)
    { 
      if(execlp("echo","echo","exec by execlp",NULL) < 0 )
           perror("error execlp");
    }

    if(fork() == 0)
    {
        if(execle("/bin/echo","echo","execut by execle",NULL,envp) < 0)
        {
            perror("error on execle");
        }
    }

    if(fork() == 0)
    {
        if(execv("/bin/echo",argv_execv) < 0)
        {
            perror("error on execv");
        }
    }
    
    if(fork() == 0)
    {
        if(execvp("echo",argv_execvp) < 0)
        {
            perror("error on execvp");
        }
    }
    
    if(fork() == 0)
    {
        if(execve("/bin/echo",argv_execve,envp) < 0)
        {
            perror("error on execve");
        }
    }
    
    return 0;
}


 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值