Hàm sigaction() để làm gì trong c linux

Chào mọi người.

Mình đọc tài liệu thì có 1 đoạn code như thế này, mình lên mạng đọc về sigaction() nhưng chưa hiểu. Nhờ bạn nào giải thích đoạn code dưới có công dụng gì. Mình cảm ơn.

struct sigaction sa;

sa.sa_handler = wait_for_child;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if(sigaction(SIGCHLD, &sa, NULL) == -1){
    error("Sigaction fail !!\n");
}

static void wait_for_child(int sig)
{
    while(waitpid(-1, NULL, WNOHANG) > 0);
}

Anh @ltd giúp em với ạ. E cần gấp.

Mình giả sử bạn đã hiểu lệnh fork() để làm gì rồi nhé vì trước đoạn code này chắc chắn có chỗ sử dụng lệnh fork().

Đoạn code trên nhằm mục đích đăng kí một hàm xử lý sự kiện, các sự kiện được xác định thông qua giá trị cờ (flag)

1 Like

Mình sử dụng chung với lệnh fork(). Mình chưa hiểu lắm về ý của bạn "đăng ký sự kiện thông qua cờ". Giờ mình bỏ khối lệnh trên thì chương trình mình có lỗi hay ảnh hưởng gì không? Cảm ơn bạn.

Khi sử dụng fork, process cha tạo process con, có một số cách để cha và con có thể liên lạc với nhau. Sử dụng signal number là một cách thông qua SIGCHILD

Điều mà cha thường cần phải biết là tình trạng của con ra sao ( stopped, restarted, terminated…). Vậy để có thể biết được tình trạng của con, cha tiến hành đăng kí với hệ điều hành để nhận thông tin SIGCHILD thông qua hàm sigaction.

Hệ điều hành cần thêm thông tin về trạng thái mà cha muốn biết thông qua sa_flags và hàm để xử lý khi con thay đổi trạng thái, đó là sa_handle.

Như đoạn code ở trên thì cha đăng kí nhận tín hiệu từ con khi con restart. Nó giống như xử lý một event vậy, thứ mà cha nó làm trong hàm waitpid đó có quan trọng hay ko là tùy thuộc vào ý đồ của cha.
Vì bạn chỉ hỏi ý nghĩa của sigaction nên mình chỉ giải thích như vậy còn waitpid nó làm gì thì bạn có thể tìm kiếm thêm thông tin

3 Likes

Cảm ơn bạn nhiều, câu trả lời quá chi tiết. :)) Mình phải tìm hiểu thêm về phần này. Chúc sức khỏe bạn.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?