Fork System Call Linux

Fork System Call Linux



Lệnh gọi hệ thống rẽ nhánh được sử dụng để tạo ra một quy trình mới. Tiến trình mới được tạo là tiến trình con. Quá trình gọi fork và tạo ra một quy trình mới là quy trình mẹ. Các tiến trình con và cha được thực hiện đồng thời.

Nhưng quy trình con và quy trình cha nằm trên các không gian bộ nhớ khác nhau. Các vùng nhớ này có nội dung giống nhau và bất kỳ hoạt động nào được thực hiện bởi một quá trình sẽ không ảnh hưởng đến quá trình kia.







Khi các tiến trình con được tạo ra; bây giờ cả hai tiến trình sẽ có cùng một Bộ đếm chương trình (PC), vì vậy cả hai tiến trình này sẽ trỏ đến cùng một lệnh tiếp theo. Các tệp được mở bởi quy trình mẹ sẽ giống nhau đối với quy trình con.



Quy trình con giống hệt như quy trình mẹ của nó nhưng có sự khác biệt về ID quy trình:



  1. ID quy trình của quy trình con là ID quy trình duy nhất khác với ID của tất cả các quy trình hiện có khác.
  2. ID quy trình chính sẽ giống với ID quy trình của cha mẹ của con.

Thuộc tính của tiến trình con

Sau đây là một số thuộc tính mà một tiến trình con nắm giữ:





  1. Bộ đếm CPU và việc sử dụng tài nguyên được khởi tạo để đặt lại về 0.
  2. Khi quá trình mẹ kết thúc, các quá trình con không nhận được bất kỳ tín hiệu nào vì thuộc tính PR_SET_PDEATHSIG trong prctl () được đặt lại.
  3. Luồng được sử dụng để gọi fork () tạo ra tiến trình con. Vì vậy, địa chỉ của tiến trình con sẽ giống với địa chỉ của cha mẹ.
  4. Trình mô tả tệp của tiến trình mẹ được kế thừa bởi tiến trình con. Ví dụ: độ lệch của tệp hoặc trạng thái của cờ và các thuộc tính I / O sẽ được chia sẻ giữa các bộ mô tả tệp của quy trình con và quy trình mẹ. Vì vậy, bộ mô tả tệp của lớp cha sẽ tham chiếu đến cùng bộ mô tả tệp của lớp con.
  5. Các bộ mô tả hàng đợi tin nhắn mở của tiến trình mẹ được kế thừa bởi tiến trình con. Ví dụ: nếu một bộ mô tả tệp chứa một thông báo trong quy trình mẹ thì thông báo tương tự sẽ xuất hiện trong bộ mô tả tệp tương ứng của quy trình con. Vì vậy, chúng ta có thể nói rằng các giá trị cờ của các bộ mô tả tệp này là giống nhau.
  6. Tương tự, các luồng thư mục mở sẽ được kế thừa bởi các tiến trình con.
  7. Giá trị độ trễ của bộ định thời mặc định của lớp con giống với giá trị độ trễ của bộ định thời hiện tại của lớp cha.

Thuộc tính không được kế thừa bởi quy trình Con

Sau đây là một số thuộc tính không được kế thừa bởi quy trình con:

  1. Khóa bộ nhớ
  2. Tín hiệu đang chờ xử lý của một lớp con trống.
  3. Xử lý khóa bản ghi liên quan (fcntl ())
  4. Hoạt động I / O không đồng bộ và nội dung I / O.
  5. Thông báo thay đổi thư mục.
  6. Các bộ định thời như alert (), setitimer () không được kế thừa bởi lớp con.

fork () trong C

Không có đối số nào trong fork () và kiểu trả về của fork () là số nguyên. Bạn phải bao gồm các tệp tiêu đề sau khi fork () được sử dụng:



#bao gồm
#bao gồm
#bao gồm

Khi làm việc với fork (), có thể được sử dụng cho loại pid_t cho các quy trình ID như pid_t được xác định trong.

Tệp tiêu đề là nơi fork () được định nghĩa, vì vậy bạn phải đưa nó vào chương trình của mình để sử dụng fork ().

Kiểu trả về được định nghĩa trong và cuộc gọi fork () được định nghĩa trong. Do đó, bạn cần đưa cả hai vào chương trình của mình để sử dụng lệnh gọi hệ thống fork ().

Cú pháp fork ()

Cú pháp của lệnh gọi hệ thống fork () trong Linux, Ubuntu như sau:

pid_t fork (void);

Trong cú pháp, kiểu trả về là pid_t . Khi tiến trình con được tạo thành công, PID của tiến trình con được trả về trong tiến trình mẹ và 0 sẽ được trả về chính tiến trình con.

Nếu có bất kỳ lỗi nào thì -1 được trả về tiến trình mẹ và tiến trình con không được tạo.

No arguments are passed to fork(). 

Ví dụ 1: Gọi ngã ba ()

Hãy xem xét ví dụ sau, trong đó chúng ta đã sử dụng lệnh gọi hệ thống fork () để tạo một tiến trình con mới:

MÃ SỐ:

#bao gồm
#bao gồm
#bao gồm

NSchủ chốt()
{
cái nĩa();
printf ('Sử dụng lệnh gọi hệ thống fork () ');
trở lại 0;
}

ĐẦU RA:

Sử dụng lệnh gọi hệ thống fork ()
Sử dụng lệnh gọi hệ thống fork ()

Trong chương trình này, chúng tôi đã sử dụng fork (), điều này sẽ tạo ra một tiến trình con mới. Khi tiến trình con được tạo, cả tiến trình mẹ và tiến trình con sẽ trỏ đến lệnh tiếp theo (cùng một Bộ đếm chương trình). Bằng cách này, các lệnh còn lại hoặc câu lệnh C sẽ được thực hiện trong tổng số lần xử lý, đó là 2nlần, trong đó n là số lần gọi hệ thống fork ().

Vì vậy, khi lệnh fork () được sử dụng một lần như trên (21= 2) chúng ta sẽ có sản lượng gấp 2 lần.

Ở đây khi lệnh gọi hệ thống fork () được sử dụng, cấu trúc bên trong sẽ giống như sau:

Hãy xem xét trường hợp sau trong đó fork () được sử dụng 4 lần:

MÃ SỐ:

#bao gồm
#bao gồm
#bao gồm

NSchủ chốt()
{
cái nĩa();
cái nĩa();
cái nĩa();
cái nĩa();
printf ('Sử dụng lệnh gọi hệ thống fork ()');
trở lại 0;
}

Đầu ra:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Bây giờ tổng số quá trình được tạo là 24= 16 và chúng tôi có câu lệnh in của chúng tôi được thực hiện 16 lần.

Ví dụ 2: Kiểm tra xem fork () có thành công không

Trong ví dụ sau, chúng tôi đã sử dụng cấu trúc ra quyết định để kiểm tra giá trị (int) được trả về bởi fork (). Và các thông báo tương ứng được hiển thị:

MÃ SỐ:

#bao gồm
#bao gồm
#bao gồm

NSchủ chốt()
{
pid_t p;
P=cái nĩa();
nếu như(P== -1)
{
printf ('Đã xảy ra lỗi khi gọi fork ()');
}
nếu như(P==0)
{
printf ('Chúng tôi đang trong quá trình trẻ em');
}
khác
{
printf ('Chúng tôi đang trong quá trình dành cho phụ huynh');
}
trở lại 0;
}

ĐẦU RA:

Chúng tôi đang trong quá trình dành cho phụ huynh
Chúng tôi đang trong quá trình trẻ em

Trong ví dụ trên, chúng ta đã sử dụng kiểu pid_t sẽ lưu giá trị trả về của fork (). fork () được gọi trên dòng:

P=cái nĩa();

Vì vậy, giá trị số nguyên được trả về bởi fork () được lưu trữ trong p và sau đó p được so sánh để kiểm tra xem lệnh gọi fork () của chúng ta có thành công hay không.

Khi lệnh gọi fork () được sử dụng và con được tạo thành công, id của tiến trình con sẽ được trả về quy trình mẹ và 0 sẽ được trả về quy trình con. ID của quy trình con trong quy trình cha sẽ không giống với ID của tiến trình con trong chính tiến trình con. Trong tiến trình con, ID của tiến trình con sẽ là 0.

Với hướng dẫn này, bạn có thể xem cách bắt đầu với lệnh gọi hệ thống fork trong linux.