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

总结

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


相关文章
|
4天前
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
43 19
|
6天前
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
37 18
|
14天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
71 13
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
消息中间件 存储 Linux
Linux手账—exec和fork
本文介绍了Linux系统中进程控制的核心功能——`fork`和`exec`系列函数。`fork`用于创建新进程(子进程),继承父进程的资源但拥有独立的地址空间;`exec`系列函数则在当前进程中执行新程序,替换原有地址空间。文章详细解析了这些函数的基本概念、用法及工作原理,强调了它们在多进程编程中的重要性。
53 0
|
安全 Linux
Linux下find与exec的联手干大事
Linux下find与exec的联手干大事
169 0
Linux下find与exec的联手干大事
|
Shell Linux C++
linux shell之paste合并文件和找到匹配的文件里面替换内容(find和-exec或xargs组合)
linux shell之paste合并文件和找到匹配的文件里面替换内容(find和-exec或xargs组合)
238 0
|
安全 Shell Linux
linux find exec
阅读目录(Content) 一. exec参数说明: 二. 使用示例 1. 查找当前目录下的文件,并对查找结果执行ls -l 命令 2. 查找当前目录下,24小时内更改过的文件,并进行删除操作(慎用!!!,删除没有提示) 3. 查找当前目录下文件名以.log结尾且24小时内更改过的文件,并进行安全删除操作(即删除前会进行询问) 4. 查找当前目录下的以.log结尾的文件或目录,并移动到test目录下 find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。
868 0
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
120 8