Sử dụng system:

Một phần của tài liệu document (Trang 32 - 34)

LẬP TRÌNH TRÊN LINU

4.5.1 Sử dụng system:

Hàm system trong thư viện chuẩn của C cung cấp là cách thức đơn giản để thực thi một lệnh từ bên trong một chương trình, tương tự như một lệnh được nhập vào từ cửa sổshell. Thực

tế hàm system tạo một tiến trình phụ chạy trong shell chuẩn Bourne (/bin/sh). Ví dụ đoạn chương trình sau sẽ gọi thực thi lệnh lshiển thị nội dung của cây thư mục gốc tương tự như khi bạn gõ ls –l trong môi trường shell.

#include <stdlib.h> int main () { int return_value; return_value = system (“ls -l /”); return return_value; }

Hàm system trả về trạng thái kết thúc của lệnh thực thi shell. Nếu shell khơng thực hiện

lệnh nó sẽ trả về giá trị 127, nếu một lỗi khác xảy ra, hàm system sẽ trả về giá trị -1.

Bởi vì hàm system sử dụng shell để gọi lệnh của bạn nên nó lệ thuộc vào đặc điểm, giới hạn và luật bảo mật của shell hệ thống. Bạn không thể dựa vào bất kỳ khả năng nào của các phiên bản riêng biệt của Bourne shell. Trong nhiều hệ thống Unix /bin/sh là một liên kết đến một shellkhác. Ví dụ trong hầu hết các hệ thống GNU/UNIX /sbin/shtrỏ đến bash shell. Những phiên bản phân phối khác của GNU/UNIX thì sử dụng những phiên bản khác nhau của bash shell. Cụ thể là một chương trình với một quyền root, với hàm system dĩ nhiên là có nhiều kết quả khác nhau trên các hệ thống GNU/UNIX khác nhau. Chính vì điều đó mà sử dụng

forkexec để tạo mới một tiến trình. 4.5.2 Sử dụng fork và exec:

DOS và API trên Winddows bao gồm họ các hàm SPAWN. Thông số của các hàm này là tên của một chương trình để chạy và tạo một tiến trình mới thể hiện của chương trình đó. Linux thì khơng bao gồm một hàm đơn để xử lý tất cả trong một bước. Thay vào đó Linux cung cấp một hàm fork, nó có thể tạo một tiến trình con như một sao chép chính xác tiến trình mẹ. Để tạo một tiến trình trước tiên sử dụng lệnh fork để tạo một bản sao của tiến trình hiện tại. Sau đó sử dụng hàmexecđể chuyển đổi một trong những tiến trình này thành thể hiện của chương trình mà bạn muốn tạo tiến trình.

Khi chương trình gọi lệnh fork, một bản sao của tiến trình cịn được gọi là tiến trình con

(child process)được tạo ra. Tiến trình mẹ tiếp tục thực hiện chương trình từ vị trí forkđược gọi. Giữa 2 tiến trình khác nhau như thế nào? Trước hết tiến trình con là một tiến trình mới vì thế nó có một số hiệu (ID) mới khác biệt với số hiệu của tiến trình cha. Một cách khác để chương trình có thể nhận ra đâu là tiến trình cha và đâu là tiến trình con là gọi hàm getpid. Tuy nhiên hàm forkcung cấp giá trị trả về khác nhau cho tiến trình cha và tiến trình con khi được tạo. Giá trị trả về của tiến trình cha là số hiệu của tiến trình con, giá trị trả về của tiến trình con là zero

Ví dụ sử dụng lệnhfork để tạo một tiến trình con. Chú ý rằng trong khối đầu tiên của phát

biểu ifchỉ được thực thi trong tiến trình cha, trong khi phát biểu trong mệnh đề elselại được thực thi trong tiến trình con.

#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main () { pid_t child_pid;

printf (“the main program process ID is %d\n”, (int) getpid ()); child_pid = fork ();

if (child_pid != 0) {

printf (“this is the parent process, with id %d\n”, (int) getpid ()); printf (“the child’s process ID is %d\n”, (int) child_pid);

}else else

printf (“this is the child process, with id %d\n”, (int) getpid ()); return 0;

}

Hàm execđặt một chương trình đang chạy trong một tiến trình với một chương trình khác. Khi một chương trình gọi hàm exec, tiến trình đó ngay lặp tức dừng chương trình đang thực thi

và bắt đầu thực thi một chương trình mới từ đó giả sử rằng gọi hàm execkhông phát sinh ra lỗi. Một số các hàm execthông dụng như sau:

Các hàm bao gồm ký tự psau tên của exec (execvp, execlp) nhận vào tên chương trình và tìm chương trình thơng qua tên của nó trong đường dẫn của chương trình thực thi hiện hành. Hàm không bao gồm ký tựpphải được cung cấp đường dẫn đầy đủ của chương trình để thực thi.

Các hàm bao gồm ký tự vsau tên exec (execv, execvp, execve)nhận vào danh sách các đối số cho chương trình mới như là một mảng khác NULL của con trỏ chuỗi. Các hàm bao gồm ký tựl (execl, execlp và execle)nhận vào danh sách các đối số sử dụng cơ chế của ngôn ngữ C.

Các hàm bao gồm ký tự e (execve, execle)nhận vào các đối số truyền thống, một mảng các biến môi trường. Các đối số phải là một mảng khác NULL con trỏ tới chuỗi ký tự, mỗi chuỗi ký tự có dạng “VARIABLE=value”

Một cách chung nhất để chạy một chương trình con bên trong một chương trình kết hợp gọi lệnh fork và exec như ví dụ sau:

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h>

/* Spawn a child process running a new program. PROGRAM is the name of the program to run; the path will be searched for this program.

ARG_LIST is a NULL-terminated list of character strings to be passed as the program’s argument list. Returns the process ID of the spawned process. */

int spawn (char* program, char** arg_list) {

pid_t child_pid; /* Duplicate this process. */

child_pid = fork (); if (child_pid != 0) /* This is the parent process. */

return child_pid; else {

/* Now execute PROGRAM, searching for it in the path. */ execvp (program, arg_list);

/* The execvp function returns only if an error occurs. */ fprintf (stderr, “an error occurred in execvp\n”); abort ();

}} }

int main () {

/* The argument list to pass to the “ls” command. */ char* arg_list[] = {

“ls”, /* argv[0], the name of the program. */ “-l”,

“/”,

NULL /* The argument list must end with a NULL. */ };

/* Spawn a child process running the “ls” command. Ignore the returned child process ID. */

spawn (“ls”, arg_list);

printf (“done with main program\n”); return 0;

}

Một phần của tài liệu document (Trang 32 - 34)

Tải bản đầy đủ (PDF)

(109 trang)