Lệnh exec trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh exec của Linux và các ứng dụng thực tế của nó. Chúng ta sẽ bắt đầu bằng cách hiểu về lời gọi hệ thống exec, được sử dụng để thực thi một chương trình hoặc lệnh trong tiến trình hiện tại, thay thế ảnh tiến trình hiện tại bằng một ảnh tiến trình mới. Sau đó, chúng ta sẽ trình bày cách thực thi các lệnh bên ngoài bằng cách sử dụng lời gọi hệ thống exec, cũng như cách chuyển hướng đầu vào và đầu ra với exec(). Lab này nhằm mục đích cung cấp một sự hiểu biết toàn diện về lệnh exec và các trường hợp sử dụng khác nhau của nó trong Linux.

Tìm hiểu về Lời Gọi Hệ Thống exec

Trong bước này, chúng ta sẽ khám phá lời gọi hệ thống exec trong Linux. Lời gọi hệ thống exec được sử dụng để thực thi một chương trình hoặc lệnh trong tiến trình hiện tại, thay thế ảnh tiến trình hiện tại bằng một ảnh tiến trình mới.

Để hiểu về lời gọi hệ thống exec, hãy bắt đầu bằng cách tạo một chương trình C đơn giản minh họa việc sử dụng nó:

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

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

Lưu đoạn mã này vào một tập tin có tên exec_example.c.

Bây giờ, hãy biên dịch và chạy chương trình:

gcc -o exec_example exec_example.c
./exec_example

Ví dụ đầu ra:

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

Như bạn có thể thấy, đầu ra chỉ hiển thị kết quả của lệnh ls -l và dòng "After exec" không được in. Điều này là do lời gọi hệ thống exec thay thế ảnh tiến trình hiện tại bằng ảnh tiến trình mới, về cơ bản là kết thúc chương trình gốc.

Lời gọi hệ thống exec nhận đường dẫn đến tập tin thực thi và các đối số sẽ được truyền cho tiến trình mới. Trong ví dụ trên, chúng ta đã sử dụng execl để thực thi lệnh /bin/ls với đối số -l.

Có một số biến thể của lời gọi hệ thống exec, chẳng hạn như execvp, execveexecvpe, cung cấp các cách khác nhau để chỉ định tệp thực thi và các đối số của nó.

Thực Thi Các Lệnh Bên Ngoài với exec()

Trong bước này, chúng ta sẽ khám phá cách thực thi các lệnh bên ngoài bằng cách sử dụng lời gọi hệ thống exec.

Lời gọi hệ thống exec có thể được sử dụng để thực thi các lệnh hoặc chương trình bên ngoài từ bên trong một chương trình C. Hãy bắt đầu bằng cách tạo một chương trình C đơn giản minh họa điều này:

#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;
}

Lưu đoạn mã này vào một tập tin có tên exec_command.c.

Bây giờ, hãy biên dịch và chạy chương trình:

gcc -o exec_command exec_command.c
./exec_command

Ví dụ đầu ra:

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

Như bạn có thể thấy, lời gọi hệ thống exec thay thế tiến trình hiện tại bằng tiến trình mới, trong trường hợp này, lệnh ls -l. Câu lệnh "This line should not be printed." không bao giờ được thực thi vì chương trình gốc bị chấm dứt bởi lệnh gọi exec.

Bạn cũng có thể thực thi các lệnh bên ngoài khác nhau bằng cách sử dụng lời gọi hệ thống exec. Ví dụ: để thực thi lệnh 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;
}

Lưu đoạn mã này vào một tập tin có tên exec_echo.c, biên dịch và chạy nó:

gcc -o exec_echo exec_echo.c
./exec_echo

Ví dụ đầu ra:

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

Lời gọi hệ thống exec cung cấp một cách mạnh mẽ để thực thi các lệnh bên ngoài từ bên trong một chương trình C, cho phép bạn tích hợp chức năng cấp hệ thống vào các ứng dụng của mình.

Chuyển Hướng Đầu Vào và Đầu Ra với exec()

Trong bước này, chúng ta sẽ học cách chuyển hướng đầu vào và đầu ra của một lệnh được thực thi bằng cách sử dụng lời gọi hệ thống exec.

Hãy bắt đầu bằng cách tạo một chương trình C đọc đầu vào từ người dùng và thực thi lệnh cat với đầu vào:

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

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

    // Redirect stdin to the user's input
    dup2(STDIN_FILENO, 0);

    // Execute the 'cat' command to display the input
    execl("/bin/cat", "cat", NULL);

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

Lưu đoạn mã này vào một tập tin có tên exec_redirect_input.c.

Bây giờ, hãy biên dịch và chạy chương trình:

gcc -o exec_redirect_input exec_redirect_input.c
./exec_redirect_input

Ví dụ đầu ra:

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

Trong ví dụ này, chúng ta sử dụng hàm dup2 để chuyển hướng đầu vào chuẩn (stdin) đến đầu vào của người dùng. Sau đó, chúng ta thực thi lệnh cat, lệnh này sẽ đọc từ stdin đã được chuyển hướng và hiển thị đầu vào.

Tiếp theo, hãy tạo một chương trình chuyển hướng đầu ra của một lệnh được thực thi bằng exec:

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

int main() {
    // Redirect stdout to a file
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    dup2(fd, STDOUT_FILENO);
    close(fd);

    // Execute the 'ls -l' command with the redirected output
    execl("/bin/ls", "ls", "-l", NULL);

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

Lưu đoạn mã này vào một tập tin có tên exec_redirect_output.c.

Biên dịch và chạy chương trình:

gcc -o exec_redirect_output exec_redirect_output.c
./exec_redirect_output

Sau khi chạy chương trình, bạn sẽ tìm thấy một tập tin có tên output.txt trong thư mục hiện tại, chứa đầu ra của lệnh ls -l.

Hàm dup2 được sử dụng để chuyển hướng đầu ra chuẩn (stdout) đến tập tin output.txt. Hàm open được sử dụng để tạo tập tin với các quyền thích hợp.

Bằng cách kết hợp chuyển hướng đầu vào và đầu ra với lời gọi hệ thống exec, bạn có thể tạo các chương trình C mạnh mẽ tích hợp chức năng cấp hệ thống với logic tùy chỉnh.

Tóm tắt

Trong lab này, chúng ta đã khám phá lời gọi hệ thống exec của Linux, được sử dụng để thực thi một chương trình hoặc lệnh trong tiến trình hiện tại, thay thế ảnh tiến trình hiện tại bằng một ảnh tiến trình mới. Chúng ta đã học cách sử dụng lời gọi hệ thống exec để thực thi các lệnh bên ngoài và cách chuyển hướng đầu vào và đầu ra với exec(). Những điểm chính cần ghi nhớ là: 1) Lời gọi hệ thống exec thay thế ảnh tiến trình hiện tại bằng ảnh tiến trình mới, về cơ bản là kết thúc chương trình gốc. 2) Lời gọi hệ thống exec có thể được sử dụng để thực thi các lệnh hoặc chương trình bên ngoài từ bên trong một chương trình C. 3) Đầu vào và đầu ra có thể được chuyển hướng khi sử dụng lời gọi hệ thống exec.

400+ câu lệnh phổ biến trong Linux