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进程。

总结

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


相关文章
|
9天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
37 3
|
9天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
29 2
|
19天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
41 5
linux系统服务二!
|
3天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
12 3
|
9天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
33 3
|
12天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
31 6
|
12天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
42 6
|
13天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
43 5
|
13天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
35 3
|
13天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####