2012-05-12 44 views
6

tôi cần phải xử lý một số tín hiệu với sigaction, nhưng khi tôi biên dịch mã của tôi, tôi nhận được lỗi này:tín hiệu Xử lý với sigaction

warning: assignment from incompatible pointer type

mã là:

struct sigaction hup_act; 
... 
hup_act.sa_flags=SA_SIGINFO; 
hup_act.sa_sigaction = sighupHandler; 
sigaction(SIGHUP, &hup_act, NULL); 

Cảnh báo là trên hup_act. phân công sa_sigaction. Cảnh báo này gây ra một lỗi phân đoạn khi tôi gửi tiếng thở dài đến ứng dụng của tôi.

+3

Vui lòng hiển thị khai báo hàm sighupHandler của bạn. Nó có lẽ là loại sai. – SKi

+0

void sighupHandler (thông tin siginfo_t *) – giozh

+1

'void sighupHandler (int, siginfo_t *, void *);' –

Trả lời

6

Nếu SA_SIGINFO được thiết lập trong struct sigaction 's thành viên sa_flags sử dụng một phương pháp loại

void signalhandler(int, siginfo_t *, void *); 

như chức năng xử lý để được giao cho struct sigaction' s thành viên sa_sigaction

khác sử dụng phương pháp loại

void signalhandler(int); 

làm chức năng xử lý được gán cho struct sigaction thành viên sa_handler.

5

sighupHandler của bạn phải là một trong hai bên dưới:

void sighupHandler(int) //for sa_handler 

hoặc

void sighupHandler(int, signinfo_t *, void *) //for sa_sigaction which is your case 

Để biết thêm về tham khảo này herehere

EDIT: Vui lòng tham khảo dưới đây và tôi ở trên các liên kết được đề xuất để rõ ràng hơn. Tôi nghĩ rằng trong trường hợp của bạn vì lưu trữ chung như đề xuất dưới đây, trình biên dịch chỉ tạo ra một cảnh báo, nếu không nó sẽ tạo ra một lỗi.

The sigaction structure is defined as something like:

struct sigaction { 
    void  (*sa_handler)(int); 
    void  (*sa_sigaction)(int, siginfo_t *, void *); 
    sigset_t sa_mask; 
    int  sa_flags; 
    void  (*sa_restorer)(void); 
}; 

On some architectures a union is involved: do not assign to both sa_handler and sa_sigaction .

+2

'.sa_restorer' là lỗi thời và không phải POSIX. Tốt hơn là không đưa nó vào ví dụ. – moshbear

Các vấn đề liên quan