30/09/2018, 18:18

Thắc mắc về ý nghĩa của signal `sig_chld`, `SIGNCHLD` trong C khi sử dụng `fork` trên Linux

sau 1 thời gian đọc tài liệu nhưng có nhiều chỗ mình ko hiểu lắm về cái signal

for( ; ; ){
    abc= xyz; /* chỉ là 1 câu lệnh*/
    if((pid = fork())==0){
        def = pqk; /* chỉ là 1 câu lệnh*/
    }
    signal(SIGCHLD,sig_chld);
    ghk = tuv; /* chỉ là 1 câu lệnh*/
}

đến cái dòng signal(SIGCHLD,sig_chld); thì ko hiểu về cái sig_chldSIGNCHLD lắm
mong mọi người chỉ giúp

Mai Anh Dũng viết 20:25 ngày 30/09/2018

Cho mình hỏi là bạn hiểu về fork chưa? Mình sẽ giải thích theo cách bạn dễ hiểu nhất nên mình cần hiểu bạn hiểu fork như thế nào?

Anh Nguyễn viết 20:33 ngày 30/09/2018

fork thì mình cũng có hiểu đôi chỗ thôi,
fork() nhân bản tiến trình trước đó, nếu thành công thì fork trả về 0, pid của tiến trình đc nhân bản trả về cho tiến trình cha(cái này mình ko hiểu nó trả về ntn?)

Mai Anh Dũng viết 20:20 ngày 30/09/2018

fork() nhân bản tiến trình trước đó,

Đúng rồi

nếu thành công thì fork trả về 0, pid của tiến trình đc nhân bản trả về cho tiến trình cha(cái này mình ko hiểu nó trả về ntn?)

Nếu thành công thì fork sẽ trả về 0 cho child process,
pid của child process sẽ được trả về cho parent process thông qua pid = fork(), với biến pid giữ process id của child process.

Nếu thất bại thì fork sẽ trả về -1 cho parent process và không có child process nào được tạo ra


Linux hỗ trợ cơ chế signal để giao tiếp giữa các process, các process có thể nói chuyện với nhau qua signal. Trong câu hỏi của bạn thì ta có signal SIGCHLD

The SIGCHLD signal is sent to the parent of a child process when it exits, is interrupted, or resumes after being interrupted. By default the signal is simply ignored.

signal này sẽ được gửi đến parent process khi child process thoát, bị interrupted hoặc resumes. Thông thường signal này sẽ bị bỏ qua

Đọc thêm về signal: http://man7.org/linux/man-pages/man7/signal.7.html


Trong đoạn code của bạn, thì signal này sẽ được sử lý bằng signal handler sign_chld

signal(SIGCHLD,sig_chld);

sig_chld là một hàm do mình tạo ra, khi parent process nhận được SIGCHLD thì ngay lập tức hàm sig_chld sẽ được gọi. Trong tài liệu của bạn sẽ có nói về sig_chld

Anh Nguyễn viết 20:32 ngày 30/09/2018

cám ơn bạn, mình đã hiểu rồi

Bài liên quan
0