Linux系统编程(exec函数家族和system函数)

简介: Linux系统编程(exec函数家族和system函数)

前言

本篇文章我们继续讲解多进程编程中的,exec函数家族和system函数

一、exec函数家族

exec 函数家族是一组在类Unix操作系统中常用的函数,用于在当前进程中执行一个新的程序。这个函数家族包括以下几个函数:

int execl(const char *path, const char *arg0, ..., const char *argn, (char *)NULL)

此函数用于执行一个可执行文件。它接受可执行文件的路径作为参数,并以可变参数的形式传递命令行参数。参数列表以空指针 (char *)NULL 结尾。

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

: 这个函数与 execl 类似,但命令行参数以数组形式传递。参数 argv 是一个以空指针结尾的字符串数组,每个元素表示一个命令行参数。

int execle(const char *path, const char *arg0, ..., const char *argn, (char *)NULL, char *const envp[]

: 这个函数与 execl 类似,但可以指定环境变量。环境变量以字符串数组形式传递,参数 envp 是以空指针结尾的字符串数组,其中每个元素表示一个环境变量。

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

这个函数与 execv 类似,但它会在程序的搜索路径中查找可执行文件。参数 file 不是一个具体的可执行文件路径,而是一个文件名。它会根据环境变量 PATH 中指定的路径搜索可执行文件。

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

这个函数与 execv 类似,但可以指定环境变量。参数 envp 是以空指针结尾的字符串数组,用于表示环境变量。

这些函数在成功执行时不会返回,如果返回了,则说明出现了错误。返回值为 -1 表示出现错误,并可通过全局变量 errno 获取具体的错误代码。

这个函数家族的作用是在当前进程中替换为一个新的程序。它们会加载新的程序,并用新的程序替换当前进程的内存空间、代码、数据以及执行环境,然后开始执行新的程序。这个过程使得当前进程的上下文完全被新程序接管,包括文件描述符、信号处理方式、资源限制等。因此,原进程的程序代码逻辑、变量值等都会被丢失。

总结一下,exec 函数家族是一组在类Unix操作系统中用于执行新程序的函数。它们通过加载新的程序并替换当前进程的内存空间和执行环境,实现了在当前进程中执行新程序的功能。这个函数家族为我们在程序中动态启动其他程序提供了便利。

二、system函数介绍

system 函数是一个标准库函数,用于在C和C++程序中执行命令行命令。它通过调用操作系统提供的相关机制来在新的子进程中执行指定的命令,并等待命令执行完成后返回。system 函数的原型如下:

int system(const char* command);

其中,command 是一个指向以 null 结尾的字符串的指针,表示要执行的命令。函数返回一个表示命令执行结果的整数值。

system 函数的工作过程如下:

1.创建一个新的子进程。

2.在子进程中调用操作系统提供的函数来执行指定的命令。

3.父进程等待子进程执行完成。

4.子进程完成执行后返回状态信息给父进程。

5.父进程返回执行结果。

system 函数的执行结果可以分为以下几类:

如果命令成功执行,并正常终止(即返回退出码为0),system 函数返回一个非零值。

如果命令成功执行,但是通过返回退出码表示出现了错误,system 函数返回该退出码。

如果命令执行失败,或者无法执行命令,system 函数返回一个表示错误的特殊值 -1。

需要注意的是,system 函数会引入一个新的子进程来执行命令,因此会产生一定的性能开销。此外,system 函数对于执行简单的命令是方便且功能强大的,但对于复杂的操作或需要对输入输出进行更细粒度控制的情况,可能需要使用更为底层的系统调用函数或者使用其他外部库来实现。

总结一下,system 函数是一个方便的标准库函数,用于在C和C++程序中执行命令行命令。它创建一个新的子进程来执行指定的命令,并等待命令执行完成后返回执行结果。这个函数适用于简单的命令执行,但对于复杂的操作或细粒度控制需求,可能需要使用其他手段。

三、system函数使用

fork.c:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
    int pid = 0;
    printf("begin\n");
    printf("now pid : %d\n", getpid());
    system("./test");
    printf("end\n");
    return 0;
}

test.c:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
    int i = 0;
    for(i = 0; i < 5; i++)
    {
        printf("sys create thread :%d\n", getpid());
        sleep(1);
    }
    return 0;
}

运行结果:

这里一共创建了三个进程:fork, sh, test。

fork和test进程好理解,那么整个sh进程是谁创建的呢?

system这个函数创建出来的进程是shell进程,所以我们可以查看到这个sh进程。

总结

本篇文章就讲解到这里,希望大家好好学习理解消化。


目录
打赏
0
0
0
0
14
分享
相关文章
|
1月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
74 24
Linux系统之whereis命令的基本使用
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
125 48
|
26天前
|
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
111 26
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
48 17
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
59 26
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
158 23
|
2月前
|
Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC
通过以上步骤,可以有效解决 systemd 服务启动失败并报错 `Main process exited, code=exited, status=203/EXEC` 的问题。关键在于仔细检查单元文件配置、验证可执行文件的有效性,并通过日志分析具体错误原因。确保可执行文件路径正确、文件具有执行权限,并且可以独立运行,将有助于快速定位和解决问题。
618 7
|
3月前
|
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
118 19
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
93 18
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
135 13
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等