栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

exec函数族 与 system函数

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

exec函数族 与 system函数

文章目录
  • 1. exec函数族
    • exec函数与fork函数
  • 2. system函数

1. exec函数族

exec函数族主要是将要执行的进程的用户空间覆盖之前进程的用户空间来执行自己的代码,所以之前进程的用户空间就会被覆盖且不会在执行

exec函数与fork函数
  • exec函数族中的函数可以实现在一个进程中执行另一个进程,这个进程可以是可执行文件、shell命令、shell脚本,它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了

  • fork函数用于创建一个子进程,该子进程几乎拷贝了父进程的全部内容。

可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

#include 
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 execvpe(const char *file, char *const argv[], char *const envp[]);
功能:在一个进程中执行另一个进程
参数:
    path/file:你要执行的进程的路径
    l:将要执行的进程按照每一个字符串的形式进行传参,最后一个位置补NULL标识结束
        例如:ls -l /
             "ls", "-l", "/", NULL
        例如:./a.out
            "./a.out", NULL
    v:将要执行的进程的命令保存在一个指针数组中再进行传参
        例如:ls -l /
            char *buf[4] = {"ls", "-l", "/", NULL};
        例如:./a.out
            char *buf[2] = {"./a.out", NULL};
     p:不带p的函数执行shell命令是必须跟当前
        要执行命令的绝对路径,带p无所谓
     e:带v的函数可以获取环境变量
返回值:
    成功执行没有返回值
    失败:-1

示例

#include 
#include 
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    pid_t pid = fork();
    if(pid == -1)
    {
        perror("fork error");
        exit(1);
    }
    else if(pid > 0) //父进程
    {
        printf("父进程正在执行...n");

        wait(NULL);
    }
    else 
    {
        printf("子进程正在执行...n");
    
        //*********************执行shell命令******************
        //调用exec函数族中的函数执行另一个进程
        //不带p的函数要执行shell命令时,第一个参数必须是绝对路径
        //可以使用whereis 命令 查询shell命令的绝对路径
        // if(execl("/bin/ls", "ls", "-l", "/", NULL) == -1)
        // {
        //     perror("execl error");
        //     exit(1);
        // }

        //带p的函数执行shell命令时第一个参数可以是绝对路径也可以是相对路径
        //if(execlp("ls", "ls", "-l", "/", NULL) == -1)
        // if(execlp("/bin/mkdir", "mkdir", "-p", "mydir1/mydir2/mydir3/mydiir4", NULL) == -1)
        // {
        //     perror("execl error");
        //     exit(1);
        // }

        //execvp的使用,需要定义一个指针数组来保存命令
        // char *buf[] = {"ls", "-l", NULL};
        // if(execvp("ls", buf) == -1)
        // {
        //     perror("execvp error");
        //     exit(1);
        // }

        //*************执行一个C语言的可执行文件***********
        //execlp("./hello", "./hello", NULL);

        //*************执行一个shell脚本***********
        execl("./myshell.sh", "./myshell.sh", NULL);

        //只要能成功执行exec函数族中的函数,则无法在回到原本的进程执行
        //因为新的进程覆盖了之前进程的用户空间
        // printf("hello worldn");
    }
    
    return 0;
}
2. system函数
#include 
int system(const char *command);
功能:执行一个shell命令
     自己会调用fork函数创建一个子进程,
     在子进程中调用execl执行指定的shell命令
参数:
    command:要执行的shell命令
返回值:不用管

(懒得翻译)

示例

#include 
#include 

int main(int argc, char const *argv[])
{
    printf("hello worldn");

    //system常用于执行一个shell命令,辅助查看执行结果
    system("ls -l");
    system("clear");
    system("ls -al");
    system("./myshell.sh");
    system("./hello");

    printf("nihao beijingn");
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/300433.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号