Ủng hộ tôi
Có thể tạo tiến trình bằng hàm fork(), hàm fork() tạo một tiến trình mới bằng cách tạo một bản sao của nó. Tiến trình gọi hàm fork() được gọi là tiến trình cha, tiến trình mới được tạo ra là tiến trình con. Tiến trình cha quay lại việc thực thi và tiến trình con bắt đầu thực thi tại cùng một nơi (nơi mà fork() trả về).
Nếu kết quả trả về của hàm fork() là 0 thì nghĩa là chúng ta đang trong tiến trình con, nếu kết quả trả về > 0 thì nghĩa là chúng ta đang trong tiến trình cha và kết quả trả về là PID của tiến trình con, nếu kết quả trả về -1 thì nghĩa là hàm fork() không thể tạo được tiến trình con.
Tiến trình cha và tiến trình con được phân biệt bởi PID của chúng, PID của tiến trình cha sẽ được gán cho PPID của tiến trình con. Đoạn code sau trình bày cách tạo 1 tiến trình con bằng fork(), các bạn cũng có thể bổ sung điều kiện kiện pid < 0 để xử lý khi việc gọi fork() thất bại.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid; // declare pid
pid = fork(); // create Child Process
if(pid == 0) // Child Process is executing
printf("Child Process, pid = %d\n", pid);
else // Parent Process is executing
printf("Parent Process, pid = %d\n", pid);
exit(0);
}
Ngoài fork(), có thể tạo tiến trình bằng họ hàm exec(), họ hàm exec() được sử dụng để thay thế tiến trình hiện tại bằng cách nạp chương trình được chỉ định tới không gian địa chỉ của nó. Nghĩa là số lượng tiến trình sẽ giữ nguyên, tiến trình mới sẽ thay thế tiến trình cũ tại không gian địa chỉ đã cấp phát và PID không đổi. Họ hàm exec() bao gồm: execl(), execlp(), execle(), exect(), execv(), execvp().
Đoạn code sau là ví dụ cho việc mở một tệp tin với tên là OpeSys.c bằng vim, đồng nghĩa với việc ta gõ lệnh vim OpeSys.c trong terminal:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
execl("/usr/bin/vim", "vim", "OpeSys.c", NULL);
printf("ERROR!!! execl() is failed!\n");
exit(1);
}