调用linux_shell、另一个可执行程序调用exec函数

exec作为Linux进程的控制原语,常用的调用方式是:
1. 调用fork()创建一个子进程
2在子进程中调用exec原语, 使程序执行另一个程序或者一个Shell文件
此时子进程的进程ID不变,只是替换掉子进程中的正文、数据、堆、栈。

exec系列函数包括六个:
int execl(const char *pathname, const char *arg0, ...);
int execv(const char *pathname, char*  const argv[]);
int execle(const char *pathname, const char *arg0,...);
int execve(const char *pathname, char* const argv[], char* const envp[]);

int execlp(const char *filename ,const char *arg0, ...);
int execvp(const char *filename, char *const argv[]);
       第一个参数如果包含了‘/’则表示路径,否则为filename。
如果为filename 则程序搜索范围$PATH环境变量下的所有路径。
       在PATH路径下末尾有个:表当前目录,如果它出现在中间则表示形式为::,开头:,注意有些情况要求搜索路径中绝不要包括当前目录。
       注意以上六个函数记忆方式:以p结尾表示,它是调用当前进程的$PATH来找到对应的可执行文件的,如果以e结尾表示,它需要显示传入一个环境值(一般用字符串数组表示)。函数中带有l的表示它需要的参数list,而如果为v则表示,它需要的是参数矢量vector。
下面是一个实例:
一个可执行程序仅函数体部分:
int main(int avgc, char* argv[])
{
     //参数列表
    //保存环境列表(字符串数组)
     extern char** environ;//(全局变量)
     char** ptr;
     int i;
     for(i=0; i           printf("argv[%d]:%s\n", i, argv[i]);
    for(ptr=environ; *ptr!=0; ptr++)
          printf("%s\n", *ptr);
    return 0;
}



//程序主体

//这里调用的是一个exe程序,当然也可以调用一个shell脚本

#include
#include
#include
#include

//环境变量字符串指针
char* envir[] = {"USER=unknown", "PATH=/home/snert/C++/test_Invote_exec", NULL};

int main()
{
    //创建一个子进程
    //在子进程中调用execle();
    
    //程序参数列表
    int i;
    pid_t pid;
        
    
    if (pid = fork() != 0)
    {
        //fork调用失败和父进程退出
        _exit(0);
    }
    
    //子进程调用execle
    if ((i = execle("New_Program", "./New_Program", "param2", "param3", (char*) 0, envir)) == -1)
    {
        printf("execle failed_error ID:%d_is%s\n", errno,  strerror(errno));
    }
    else
    {
        printf("execle Successed!");
    }
    sleep(10);
    
    return 0;
}



你可能感兴趣的:(Linux_进程的控制)