linux/UNIX中如何使用fork函数调用exec函数族,实现子进程做特定操作

前言

在 Unix/Linux 操作系统中,进程是一种非常重要的概念。进程是程序执行的实例,操作系统会为每个进程分配资源,进程之间相互独立,可以进行通信。在 Unix/Linux 中,我们可以使用 fork 和 exec 函数族来创建子进程并执行新的程序。本篇博客将深入浅出地介绍 fork 函数和 exec 函数族,包括它们的基本用法、相关概念、流程图以及代码示例。

先介绍如何在子进程中使用exec函数族,想要了解fork创建子进程和exec函数族的,可以先看下面

在使用 exec 函数族之前,我们需要先使用 fork 函数创建一个新的子进程。然后,在子进程中,我们可以使用 exec 函数族来执行新的程序。exec 函数族会将当前进程的地址空间替换为新程序的地址空间,并执行新程序。新程序将从 main 函数开始执行,因此我们需要在新程序中定义 main 函数。

下面是一个示例,演示了如何在子进程中使用 exec 函数族来执行新的程序:

include <stdio.h>

include <stdlib.h>

include <unistd.h>

int main()

{

    pid_t pid;

pid = fork(); // 创建子进程

if (pid == -1) // 创建失败
{
    printf("Fork error\n");
    exit(1);
}
else if (pid == 0) // 在子进程中
{
    printf("I am child process. My pid is %d.\n", getpid());
    execl("/bin/ls", "ls", "-l", NULL); // 执行 ls -l 命令
    exit(0);
}
else // 在父进程中
{
    printf("I am parent process. My pid is %d. My child pid is %d.\n", getpid(), pid);
}

return 0;

}
在上面的示例中,我们使用 fork 函数创建了一个子进程。在子进程中,我们输出了子进程的 ID,然后使用 execl 函数来执行 ls -l 命令。在 execl 函数中,第一个参数是要执行的程序的路径,第二个参数是要传递给新程序的参数列表。我们将 ls -l 命令的路径传递给 execl 函数的第一个参数,将 ls 和 -l 两个参数传递给第二个参数,最后使用 NULL 表示参数列表的结尾。

在父进程中,我们输出了父进程和子进程的 ID,然后等待子进程结束。

fork 函数

fork函数详解链接
fork 函数是 Unix/Linux 中非常重要的函数之一。它用于创建一个新的进程,该进程称为子进程。子进程与父进程共享大部分资源,包括代码段、数据段、堆、栈、文件描述符等。但是,子进程拥有自己的独立的进程 ID,并且具有自己的用户 ID 和组 ID。

fork 函数的原型如下:

#include <unistd.h>

pid_t fork(void);
fork 函数的返回值有以下三种情况:

在父进程中,fork 函数返回新创建子进程的进程 ID;
在子进程中,fork 函数返回 0;
如果 fork 函数返回值为负数,则表示出现错误。
下面是一个简单的示例,演示了 fork 函数的基本用法:

#include <stdio.h>
#include <unistd.h>
int main()
{
    pid_t pid;

    pid = fork(); // 创建子进程
    
    if (pid == -1) // 创建失败
    {
        printf("Fork error\n");
    }
    else if (pid == 0) // 在子进程中
    {
        printf("I am child process. My pid is %d.\n", getpid());
    }
    else // 在父进程中
    {
        printf("I am parent process. My pid is %d. My child pid is %d.\n", getpid(), pid);
    }
    
    return 0;
}

在上面的示例中,我们使用 fork 函数创建了一个子进程。在父进程中,fork 函数返回子进程的进程 ID,我们通过判断 fork 函数的返回值是否为 0 来确定当前进程是父进程还是子进程。在子进程中,我们输出了当前进程的 ID,而在父进程中,我们输出了父进程和子进程的 ID。

exec 函数族

exec 函数族详解链接
exec 函数族用于执行新的程序。在 Unix/Linux 中,我们可以使用 exec 函数族来替换当前进程的代码段、数据段、堆和栈等信息,然后执行新的程序。exec 函数族一共有 6 个函数,包括:

int execl(const char *path, const char *arg, …);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg, …, char *const envp[]);
int execve(const char *path, charconst argv[], char *const envp[]);
int execlp(const char *file, const char *arg, …);
int execvp(const char *file, char *const argv[]);
这些函数的区别在于它们接受的参数不同,但是它们的功能都是一样的,都可以用来执行新的程序。

总结
本篇博客介绍了 fork 函数和 exec 函数族的基本用法、相关概念、流程图以及代码示例。fork 函数用于创建一个新的进程,exec 函数族用于执行新的程序。在使用 exec 函数族之前,我们需要先使用 fork 函数创建一个新的子进程。然后,在子进程中,我们可以使用 exec 函数族来执行新的程序。

希望这篇博客能够帮助你理解 fork 函数和 exec 函数族的用法。如果你还有任何问题或疑问,请随时在评论区留言,我会尽快回复

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值