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
, execve
và execvpe
, 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
.