C 语言 system() 和 execl() 调用区别

2025年1月7日 | 5 分钟阅读

C 语言中的 system()execl() 函数用于执行外部命令或程序。在本文中,我们将讨论 C 语言中 system()execl() 调用的区别。但在讨论它们的区别之前,我们必须先了解 C 语言中的 system() 和 execl() 调用。

什么是 system() 调用?

程序通过 system() 调用与操作系统进行通信。它用于在进程内执行命令。通过应用程序编程接口 (API),系统调用使操作系统服务可供用户程序使用。它不会替换当前进程的映像,而是充当进程和操作系统之间的接口。

语法

它具有以下语法:

参数

command: 一个字符串,包含要传递给命令处理器 (shell) 的命令。

返回值

如果执行成功,system() 返回实现定义的,通常是命令的退出状态。

如果命令无法运行或被信号终止,则返回 -1。

示例

让我们用一个例子来说明 C 语言中的 system() 调用。

输出

 
-rwxrwxrwx 1 root  root    455 May 12 18:17 main.c
Command executed with exit status: 0

说明

  1. 包含头文件
    此程序中包含的标准库头文件 (stdlib.h 和 stdio.h) 提供了 system() 和 printf() 函数。
  2. 主函数
    这是程序的入口点。程序执行从此处开始。
  3. 使用 system() 执行命令
    命令作为 system() 方法的参数执行。在这种情况下,它运行“ls -l”命令,该命令提供当前目录中所有文件的长格式列表。system() 返回已执行命令的退出状态。
  4. 检查结果并处理错误
    程序验证 system() 调用的结果。如果结果为 -1,则发生错误,并使用 perror() 函数将错误消息打印到标准错误流。如果结果不是 -1,则表示命令已成功执行,然后使用 printf() 打印退出状态。
  5. 从 Main 返回
    main 函数返回 0,表示程序已成功运行。

什么是 execl()?

execl() 函数族属于 exec 族,该族用新进程映像替换当前进程映像。execl() 函数有几种变体(例如 execl(), execle(), execlp() 等),但它们都具有相似的目的。

语法

它具有以下语法:

参数

  • path: 可执行文件的路径。
  • arg0,...: 新程序的命令行参数。
  • (char *)NULL: 一个哨兵值,表示参数列表的结束。

返回值

  • 如果 execl() 成功,新程序将在当前进程中运行;它不会返回。
  • 如果发生错误,则返回 -1。

示例

让我们用一个例子来说明 C 语言中的 execl() 调用

输出

 
the step before the execl call
PID TTY          TIME CMD
  13619 pts/37   00:00:00 dash
13626 pts/37   00:00:00 ps

说明

1. 包含头文件

该程序包含 execl 函数以及用于 Unix 系统调用 (unistd.h) 和输入输出 (stdio.h) 的标准头文件。

2. Main 函数

这是程序启动的地方。

3. 在 'execl' 之前打印

execl 调用之前的行会打印一条消息。

4. 'execl' 系统调用

此函数用于启动由命令指定的新进程,而不是当前运行的进程。在这里,它执行“ps 命令”,该命令显示正在运行的进程列表。可执行文件的路径(“/bin/ps”)是第一个参数;命令本身(“ps”)是第二个参数;NULL 是第三个参数,表示参数列表的结束。

如果 execl 成功地用“ps”命令替换了正在运行的进程,则原始程序中的后续代码将不会执行。如果 execl 失败(如果找不到指定的可执行文件),程序将从下一行继续执行。在这种情况下,它返回 -1。

5. 在 'execl' 之后打印

只有在 execl 失败时才能到达此行。打印的消息表示 execl 调用之后的步骤。

System() 和 Execl() 调用在 C 语言中的主要区别

Difference between system() and execl() call in C

C 语言中的 system()execl() 之间有几个主要区别。这些调用之间的一些主要区别如下:

1. 目的

system(): 此函数在 C 程序中执行shell命令。

execl(): 此函数用于将当前进程映像替换为全新的映像。

2. 输入

system(): 它接受一个字符串参数作为 shell 中的命令。

execl(): 它接受可执行文件的路径、其名称和参数列表。

3. 控制流

system(): shell 命令完成后,控制流返回到 C 程序。涉及一个单独的 shell 进程。

execl(): 它不返回;如果成功,新可执行文件将替换正在运行的进程。如果发生错误,则返回 -1。

4. Shell 的参与

system(): 此函数使用 shell,这意味着可能存在额外的开销和安全风险。

execl(): execl() 不使用 shell。指定的可执行文件会立即加载到正在运行的进程中。

5. 灵活性

system(): 它对进程执行的细节控制有限。对于简单的 shell 命令来说,它更方便。

execl(): 它提供了对正在运行的进程的更精确的控制。它允许指定精确的可执行文件及其参数。

6. 返回值

system(): 它提供 shell 命令的退出状态,或者在命令无法运行时返回实现定义的

execl(): 成功时不返回。如果发生错误,则返回 -1。

7. 错误处理

system(): 它的错误处理有限;可能不会提供具体的错误信息。

execl(): 它提供更详细的错误信息。如果发生错误,它返回 -1,我们可以使用 perror() 获取更多信息。