Tạo mới tiến trình với fork
in Programming on C++, Process, Linux
Tiến trình(process) trong Linux
Linux là một hệ điều hành đa nhiệm, vì thế có thể chạy cùng nhiều chương trình. Mỗi một chương trình đang chạy sử dụng một hoặc nhiều tiến trình(process).
Mỗi tiến trình trên Linux được nhận biết thông qua pid của nó. Pid là một số 16 bits được gán tuần tự khi một tiến trình mới khởi tạo.
Mỗi tiến trình có một tiến trình cha. Các tiến trình trong hệ điều hành Linux được sắp xếp thành cây tiến trình, với tiến trình khởi tạo (init) là tiến trình gốc (root). ID của tiến trình cha gọi là ppid(parent pid).
Linux chỉ cho phép tạo tiến trình tối đa 4 cấp.
Hàm fork
Hàm fork()
sẽ tạo mới một tiến trình bằng việc “sao chép” tiến trình gọi nó. Tiến trình mới được tạo ra gọi là tiến trình con, tiến trình gọi hàm fork là tiến trình cha.
Khi thành công, PID của tiến trình còn sẽ được trả về trong tiến trình cha, nếu mà tiến trình đang gọi hàm fork
là tiến trình con thì hàm sẽ trả về 0. Ngược lại, nếu hàm thất bại, giá trị -1 sẽ được trả về trong tiến trình cha, lúc này không có bất cứ tiến trình còn mới nào được tạo.
Những tiến trình mới tạo ra được gọi là các tiến trình con và mỗi tiến trình con lúc ban đầu đều chia sẻ chung tất cả các segments như text, heap hay stack…cho đến khi một tiến trình con cố gắng thay đổi nội dung của stack hoặc heap. Trong trường hợp có bất cứ thay đổi nào, một bản copy riêng biệt của stack hay heap sẽ được tạo ra cho tiến trình con(tiến trình đang cố gắng thay đổi nội dung của statck hoặc heap). Tuy nhiên text segment là readonly vì thế nên cả tiến trình chả và con đều chia sẻ chung vùng này[2].
Sử dụng hàm fork
Như đã đề cập ở trên, khi hàm fork
thành công nó sẽ trả về PID(giá trị nguyên 2 bytes và dĩ nhiên lớn hơn 0 rồi) của tiến trình con nếu “đứa gọi hàm fork
là thèn cha”, còn khi giá trị này là 0 thì nghĩa là thèn con đang gọi hàm fork
rồi. Tại sao lại phải phân biệt như thế này, đơn giản là fork sẽ “sao chép” lại thèn cha kiểu như “cha nào con nấy”. Và như thế thèn con cũng sẽ lại làm đúng y như những gì cha nó đã làm. Vậy làm sao ta phân biệt được đâu là cha làm, đâu là con làm? Đơn giản ta chỉ cần xét giá trị trả về của hàm fork thôi, nếu 0 nghĩa là thèn đang gọi fork là con, nếu lớn hơn 0 thì thèn đang gọi fork
là cha. Đây là code cho ví dụ này:
Đây là kết quả
References
- https://vi.wikipedia.org/wiki/Linux
- https://www.thegeekstuff.com/2013/11/linux-process-and-threads/comment-page-1/