ここでの目標は、SIGINT をキャッチして、小さなソケット サーバーのサーバー ソケットを閉じることでした。コードをきれいに保つために、ネストされた関数を使用しようとしました。しかし...
Ctrl-C (SIGINT ですよね?) を実行すると、Illegal instruction: 4
. この投稿を読んだ後、10.8 を使用-mmacosx-version-min=10.8
しているため、コンパイル フラグに追加しようとしました。Ctrl-C を実行すると同じエラーが発生します。
ここで 2 つの質問があります: なぜ「Illegal instruction 4」が表示されるのですか?グローバル変数を使用せずにサーバー ソケットを閉じるにはどうすればよいですか?
私のソフトウェア:
Mac OSX 10.8.4
GCC 4.2.1
コンパイル方法は次のとおりです。
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;
}