Linux exec 命令实用示例

LinuxLinuxBeginner
立即练习

介绍

在本实验中,我们将探索 Linux 的 exec 命令及其实际应用。我们将从理解 exec 系统调用开始,该系统调用用于在当前进程中执行程序或命令,用新的进程映像替换当前进程映像。然后,我们将演示如何使用 exec 系统调用执行外部命令,以及如何使用 exec() 重定向输入和输出。本实验旨在全面理解 exec 命令及其在 Linux 中的各种用例。

Linux 命令速查表

理解 exec 系统调用

在这一步中,我们将探索 Linux 中的 exec 系统调用。exec 系统调用用于在当前进程中执行程序或命令,用新的进程映像替换当前进程映像。

为了理解 exec 系统调用,让我们从一个简单的 C 程序开始,演示其用法:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Before exec\n");
    execl("/bin/ls", "ls", "-l", NULL);
    printf("After exec\n");
    return 0;
}

将此代码保存为 exec_example.c 文件。

现在,编译并运行该程序:

gcc -o exec_example exec_example.c
./exec_example

示例输出:

Before exec
total 4
-rwxrwxr-x 1 labex labex 8704 May 30 11:32 exec_example

如你所见,输出仅显示了 ls -l 命令的结果,而 "After exec" 这一行并未打印。这是因为 exec 系统调用用新的进程映像替换了当前进程映像,从而终止了原始程序。

exec 系统调用接收可执行文件的路径以及传递给新进程的参数。在上面的示例中,我们使用 execl 来执行 /bin/ls 命令,并传递了 -l 参数。

exec 系统调用有多个变体,例如 execvpexecveexecvpe,它们提供了不同的方式来指定可执行文件及其参数。

使用 exec() 执行外部命令

在这一步中,我们将探索如何使用 exec 系统调用来执行外部命令。

exec 系统调用可以用于在 C 程序中执行外部命令或程序。让我们从一个简单的 C 程序开始,演示这一点:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Executing 'ls -l' command using exec:\n");
    execl("/bin/ls", "ls", "-l", NULL);
    printf("This line should not be printed.\n");
    return 0;
}

将此代码保存为 exec_command.c 文件。

现在,编译并运行该程序:

gcc -o exec_command exec_command.c
./exec_command

示例输出:

Executing 'ls -l' command using exec:
total 12
-rwxrwxr-x 1 labex labex 8704 May 30 11:32 exec_command
-rw-rw-r-- 1 labex labex  241 May 30 11:32 exec_command.c
-rw-rw-r-- 1 labex labex   70 May 30 11:32 exec_example.c

如你所见,exec 系统调用用新的进程替换了当前进程,在这个例子中是 ls -l 命令。"This line should not be printed." 这一行永远不会被执行,因为原始程序被 exec 调用终止了。

你也可以使用 exec 系统调用执行不同的外部命令。例如,执行 echo 命令:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Executing 'echo Hello, World!' using exec:\n");
    execl("/bin/echo", "echo", "Hello, World!", NULL);
    printf("This line should not be printed.\n");
    return 0;
}

将此代码保存为 exec_echo.c 文件,编译并运行它:

gcc -o exec_echo exec_echo.c
./exec_echo

示例输出:

Executing 'echo Hello, World!' using exec:
Hello, World!

exec 系统调用提供了一种强大的方式,可以在 C 程序中执行外部命令,从而将系统级功能集成到你的应用程序中。

使用 exec() 重定向输入和输出

在这一步中,我们将学习如何重定向使用 exec 系统调用执行的命令的输入和输出。

让我们从一个 C 程序开始,该程序从用户读取输入并使用该输入执行 cat 命令:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Enter some text: ");

    // 将 stdin 重定向到用户的输入
    dup2(STDIN_FILENO, 0);

    // 执行 'cat' 命令以显示输入
    execl("/bin/cat", "cat", NULL);

    printf("This line should not be printed.\n");
    return 0;
}

将此代码保存为 exec_redirect_input.c 文件。

现在,编译并运行该程序:

gcc -o exec_redirect_input exec_redirect_input.c
./exec_redirect_input

示例输出:

Enter some text: Hello, World!
Hello, World!

在这个例子中,我们使用 dup2 函数将标准输入(stdin)重定向到用户的输入。然后,我们执行 cat 命令,该命令将从重定向的 stdin 中读取并显示输入。

接下来,让我们创建一个程序,重定向使用 exec 执行的命令的输出:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
    // 将 stdout 重定向到一个文件
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    dup2(fd, STDOUT_FILENO);
    close(fd);

    // 执行 'ls -l' 命令并将输出重定向
    execl("/bin/ls", "ls", "-l", NULL);

    printf("This line should not be printed.\n");
    return 0;
}

将此代码保存为 exec_redirect_output.c 文件。

编译并运行该程序:

gcc -o exec_redirect_output exec_redirect_output.c
./exec_redirect_output

运行程序后,你应该会在当前目录中找到一个名为 output.txt 的文件,其中包含 ls -l 命令的输出。

dup2 函数用于将标准输出(stdout)重定向到文件 output.txtopen 函数用于创建具有适当权限的文件。

通过将输入和输出重定向与 exec 系统调用结合使用,你可以创建强大的 C 程序,将系统级功能与自定义逻辑集成在一起。

总结

在本实验中,我们探索了 Linux 的 exec 系统调用,该系统调用用于在当前进程中执行程序或命令,用新的进程映像替换当前进程映像。我们学习了如何使用 exec 系统调用来执行外部命令,以及如何使用 exec() 重定向输入和输出。关键要点包括:1) exec 系统调用用新的进程映像替换当前进程映像,从而终止原始程序。2) exec 系统调用可以用于在 C 程序中执行外部命令或程序。3) 在使用 exec 系统调用时,可以重定向输入和输出。

Linux 命令速查表