Thực thi cuộc gọi hệ thống trong C

Exec System Call C



Họ thực thi có nhiều hàm trong C. Các hàm C này về cơ bản được sử dụng để chạy một lệnh hệ thống trong một tiến trình riêng biệt mà chương trình chính và in ra kết quả.

Trong bài viết này, tôi sẽ nói về họ hàm thực thi và chỉ cho bạn cách sử dụng từng hàm họ thực thi này trong C. Vì vậy, hãy bắt đầu.







Chức năng hệ thống C trong họ Exec:

Các họ hàm thực thi được định nghĩa trong tiêu đề unistd.h . Vì vậy, bạn phải sử dụng tiêu đề này trên chương trình C nơi bạn muốn sử dụng các hàm này.



Các hàm thực thi có sẵn cùng với các tham số hàm của chúng được đưa ra dưới đây:



  • int executel (const char * path, const char * arg,…, NULL);
  • int executelp (const char * file, const char * arg,…, NULL);
  • int executev (const char * path, char * const argv []);
  • int executevp (const char * file, char * const argv []);
  • int thực thi (const char * path, const char * arg,…, NULL, char * const envp []);
  • int execute (const char * file, char * const argv [], char * const envp []);

Hãy xem từng chức năng này làm gì và sử dụng chúng như thế nào.





executel () Chức năng hệ thống:

Trong hàm hệ thống executel () lấy đường dẫn của tệp nhị phân thực thi (tức là / bin / ls ) như đối số thứ nhất và thứ hai. Sau đó, các đối số (tức là -lh , /Trang Chủ ) mà bạn muốn chuyển đến tệp thực thi, theo sau là VÔ GIÁ TRỊ . Sau đó, hàm hệ thống executel () chạy lệnh và in đầu ra. Nếu có bất kỳ lỗi nào xảy ra, thì hàm executel () trả về -1. Nếu không, nó không trả về gì.

Cú pháp:

NSngười thực thi(hăng sô char *con đường, hăng sô char *tức giận,...,VÔ GIÁ TRỊ);

Dưới đây là một ví dụ về hàm hệ thống executel ():



#bao gồm

NSchủ chốt(vô hiệu) {
char *binaryPath= '/ bin / ls';
char *arg1= '-lh';
char *arg2= '/Trang Chủ';

người thực thi(binaryPath,binaryPath,arg1,arg2,VÔ GIÁ TRỊ);

trở lại 0;
}

Tôi đã chạy ls -lh / nhà lệnh sử dụng hàm hệ thống executel (). Như bạn có thể thấy, kết quả chính xác được hiển thị.

executelp () Chức năng hệ thống:

executel () không sử dụng CON ĐƯỜNG biến môi trường. Vì vậy, đường dẫn đầy đủ của tệp thực thi được yêu cầu để chạy tệp đó với executel (). executelp () sử dụng biến môi trường PATH. Vì vậy, nếu một tệp hoặc lệnh thực thi có sẵn trong PATH, thì lệnh hoặc tên tệp đã đủ để chạy nó, đường dẫn đầy đủ là không cần thiết.

Cú pháp:

NSthực thi(hăng sô char *tập tin, hăng sô char *tức giận,...,VÔ GIÁ TRỊ);

Chúng ta có thể viết lại ví dụ executel () bằng cách sử dụng hàm hệ thống certlp () như sau:

#bao gồm

NSchủ chốt(vô hiệu) {
char *tên chương trình= 'ls';
char *arg1= '-lh';
char *arg2= '/Trang Chủ';

thực thi(tên chương trình,tên chương trình,arg1,arg2,VÔ GIÁ TRỊ);

trở lại 0;
}

Tôi chỉ chuyển tên lệnh ls , không phải con đường đầy đủ / bin / ls . Như bạn có thể thấy, tôi đã nhận được đầu ra tương tự như trước đây.

executev () Chức năng hệ thống:

Trong hàm executel (), các tham số của tệp thực thi được chuyển cho hàm dưới dạng các đối số khác nhau. Với executev (), bạn có thể chuyển tất cả các tham số trong một mảng có kết thúc NULL argv . Phần tử đầu tiên của mảng phải là đường dẫn của tệp thực thi. Nếu không, hàm executev () hoạt động giống như hàm executel ().

Cú pháp:

NSngười thực thi(hăng sô char *con đường, char *hăng sôargv[]);

Chúng ta có thể viết lại ví dụ executel () như sau:

#bao gồm

NSchủ chốt(vô hiệu) {
char *binaryPath= '/ bin / ls';
char *args[] = {binaryPath, '-lh', '/Trang Chủ',VÔ GIÁ TRỊ};

người thực thi(binaryPath,args);

trở lại 0;
}

Như bạn có thể thấy, tôi đang nhận được đầu ra chính xác.

Thực thi Hệ thống () Chức năng:

Hoạt động giống như hàm hệ thống executev (). Nhưng, biến môi trường PATH được sử dụng. Vì vậy, đường dẫn đầy đủ của tệp thi hành không được yêu cầu giống như trong tệp thực thi.

Cú pháp:

NSthực thi(hăng sô char *tập tin, char *hăng sôargv[]);

Chúng ta có thể viết lại ví dụ executev () như sau:

#bao gồm

NSchủ chốt(vô hiệu) {
char *tên chương trình= 'ls';
char *args[] = {tên chương trình, '-lh', '/Trang Chủ',VÔ GIÁ TRỊ};

thực thi(tên chương trình,args);

trở lại 0;
}

Như bạn có thể thấy, đầu ra chính xác được hiển thị.

Thực thi () Chức năng Hệ thống:

Hoạt động giống như executel () nhưng bạn có thể cung cấp các biến môi trường của riêng mình cùng với nó. Các biến môi trường được truyền dưới dạng một mảng envp . Phần tử cuối cùng của envp mảng phải là NULL. Tất cả các phần tử khác chứa các cặp khóa-giá trị dưới dạng chuỗi.

Cú pháp:

NSngười thi hành(hăng sô char *con đường, hăng sô char *tức giận,...,VÔ GIÁ TRỊ, char * hăng sôenvp[] );

Dưới đây là một ví dụ về hàm hệ thống thực thi ():

#bao gồm

NSchủ chốt(vô hiệu) {
char *binaryPath= '/ bin / bash';
char *arg1= '-NS';
char *arg2= 'quăng đi 'Truy cập $ HOSTNAME:$ PORT từ trình duyệt của bạn.'';
char *hăng sôenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',VÔ GIÁ TRỊ};

người thi hành(binaryPath,binaryPath,arg1,arg2,VÔ GIÁ TRỊ,env);

trở lại 0;
}

Tôi đã chuyển hai biến môi trường HOSTNAMEHẢI CẢNG tới hàm execute (). Như bạn có thể thấy, tôi có thể truy cập chúng từ tệp thực thi / bin / bash .

Thực thi () Chức năng Hệ thống:

Cũng giống như execute (), bạn có thể cung cấp các biến môi trường của riêng mình cùng với execute (). Bạn cũng có thể truyền các đối số dưới dạng mảng như bạn đã làm trong executev ().

Cú pháp:

NSthi hành(hăng sô char *tập tin, char *hăng sôargv[], char *hăng sôenvp[]);

Ví dụ thực thi () có thể được viết lại như sau:

#bao gồm

NSchủ chốt(vô hiệu) {
char *binaryPath= '/ bin / bash';
char *hăng sôargs[] = {binaryPath, '-NS', 'quăng đi 'Truy cập $ HOSTNAME:$ PORT
từ trình duyệt của bạn.'',VÔ GIÁ TRỊ};
char *hăng sôenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',VÔ GIÁ TRỊ};

thi hành(binaryPath,args,env);

trở lại 0;
}

Như bạn có thể thấy, chúng ta nhận được đầu ra tương tự như trong ví dụ execute ().

Vì vậy, đó là cách bạn sử dụng họ hàm thực thi trong C để lập trình hệ thống trong Linux. Cảm ơn đã đọc bài viết này.