exec函数族 与 system函数

本文介绍了Linux下的exec函数族,它们通过覆盖进程的用户空间来执行新的代码,而fork函数则用于创建子进程。exec函数可以在同一进程中执行可执行文件或脚本,替换原有进程内容。system函数的相关内容未详述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. exec函数族

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

exec函数与fork函数

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

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

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

#include <unistd.h>
int execl(const char *path, const char *arg, .../* (char  *) NULL */);
int execlp(const char *file, const char *arg, .../* (char  *) NULL */);
int execle(const char *path, const char *arg, .../*, (char *) NULL*/,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 <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>

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 world\n");
    }
    
    return 0;
}

2. system函数

#include <stdlib.h>
int system(const char *command);
功能:执行一个shell命令
     自己会调用fork函数创建一个子进程,
     在子进程中调用execl执行指定的shell命令
参数:
    command:要执行的shell命令
返回值:不用管

(懒得翻译)
在这里插入图片描述

示例

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

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

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

    printf("nihao beijing\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值