這裏的目標是捕獲SIGINT以關閉小型套接字服務器上的服務器套接字。我試圖使用嵌套函數來保持代碼清潔。但...OSX帶有嵌套函數的「非法指令4」
當我做Ctrl-C(SIGINT,對嗎?)時,我得到Illegal instruction: 4
。在閱讀this post後,我試着在編譯標誌中加入-mmacosx-version-min=10.8
,因爲我在10.8上。執行Ctrl-C時出現同樣的錯誤。這裏
兩個問題:爲什麼我收到`非法指令4" 我怎樣才能關閉服務器套接字不使用全局變量
我的軟件:??
Mac OSX 10.8.4
GCC 4.2.1
下面是我「M編譯:
gcc -fnested-functions main.c
下面的代碼:
#include <sys/socket.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void register_sigint_handler(int *serverSocket)
{
void sigint_handler(int signal) {
printf("Shutting down...\n");
printf("Server socket was %d\n", *serverSocket);
close(*serverSocket);
exit(0);
}
signal(SIGINT, &sigint_handler);
}
int main(void) {
int serverSocket = 0, guestSocket = 0;
register_sigint_handler(&serverSocket);
serverSocket = socket(PF_INET, SOCK_STREAM, 0);
while (1) {}
close(serverSocket);
return 0;
}
您是否嘗試使用調試器(gdb/lldb)? – Kevin
這不會導致你的問題,但'printf'不安全的調用信號處理程序。信號處理程序在其中可以做的事情非常有限 - 最安全的做法是設置一個標誌(類型爲'volatile sigatomic_t'),然後在主循環期間定期檢查該標誌,並注意'EINTR '系統調用的錯誤代碼,如'accept(2)'和'select(2)'。 –
@AdamRosenfield:由於代碼使用套接字,因此它可能使用[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04)規定的不太嚴格的規則安全地從信號處理程序調用。安全列表仍然不包含'printf()',但它確實允許使用很多其他函數,包括'write()'。但是,您評論的主要內容仍然是準確的:(1)不要調用'printf()'等,(2)謹慎處理信號處理程序中的操作。 –