2012-01-13 66 views
13

Tôi đang viết chương trình vỏ phải xử lý tín hiệu. có liên quan xử lý mã tín hiệu liên quan của tôi là như sau:biên dịch lỗi bằng cách sử dụng signal.h trong Linux

#include <signal.h> 
... 
#include <sys/types.h> 
... 
void installSigactions(int, struct sigaction*); 

void handler_function(int signal_id); 
... 
/*define signal table*/ 
struct sigaction signal_action; 

/*insert handler function*/ 
signal_action.sa_handler = handler_function; 

/*init the flags field*/ 
signal_action.sa_flags = 0; 

/*are no masked interrupts*/ 
sigemptyset(&signal_action.sa_mask); 

/*install the signal_actions*/ 
sigaction(SIGINT, &signal_action, NULL); 

Biên dịch mang lại cho tôi những lời cảnh báo và các lỗi sau đây:

gcc -Wall -ggdb -ansi -static -pedantic -o os1shell2 os1shell2.c 
os1shell2.c:35: warning: 'struct sigaction' declared inside parameter list 
os1shell2.c:35: warning: its scope is only this definition or declaration, 
which is probably not what you want 
os1shell2.c: In function 'main': 
os1shell2.c:66: error: storage size of 'signal_action' isn't known 
os1shell2.c:75: warning: implicit declaration of function 'sigemptyset' 
os1shell2.c:78: warning: implicit declaration of function 'sigaction' 

bất cứ ai có thể cho tôi biết tại sao tôi nhận được những cảnh báo và lỗi?

Trả lời

12

Nó sẽ hoạt động nếu bạn xóa -ansi khỏi dòng biên dịch của mình. Tôi nghi ngờ vấn đề là các phần posix của thư viện tín hiệu không được bao gồm khi bạn chỉ định -ansi.

Nếu bạn thực sự không muốn vô hiệu hóa -ansi, bạn cũng có thể thêm -D_POSIX_C_SOURCE vào tùy chọn trình biên dịch.

Here is a short discussion of ANSI and the gcc feature test macros.

+0

xóa '-ansi' để lại cho tôi: ' /tmp/ccl4HmT7.o: Trong hàm main': ' '/home/stu1/s11/gaw9451/Khóa học/OS_3/os1shell2.c: 68: undefined' 'tham chiếu đến handler_function'' ' collect2: ld trả về 1 trạng thái thoát ' Việc thêm '-D_POSIX_C_SOURCE' làm tương tự. Bất kỳ ý tưởng về điều này? – Ataraxia

+0

Bạn có 'handler_function' được định nghĩa ở bất kỳ đâu không? Nó được khai báo trong câu hỏi của bạn, nhưng không có mã cho nó. Tôi đã phải thêm 'void handler_function (int signal_id) {}', và sau đó mã của bạn được biên dịch tốt. –

0

Vui lòng thử di chuyển "sys/types.h" trước "signal.h".

Nếu điều đó không làm việc, hãy thử thêm này:

#include <bits/sigaction.h> 

Nếu nó vẫn không làm việc, xin vui lòng ghi rõ:

1) hệ điều hành và phiên bản của bạn

2) Phiên bản gcc của bạn

+0

không trợ giúp ... nhưng đó là một đề xuất tốt – Ataraxia

+2

Không bao giờ bao gồm '' trực tiếp. Thậm chí có cả '# error' ở phía trên cùng của tập tin khiến bạn không muốn làm điều này. – Celada

+0

'uname -a' 'Linux massachusetts 2.6.32-37-generiC# 81-Ubuntu SMP Thứ Sáu ngày 2 tháng 12 20:35:14 UTC 2011 i686 GNU/Linux' 'gcc --version' 'gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 ' – Ataraxia

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