/* * $Id: tcp-connect-signal.c,v 1.1 2005年06月11日 18:12:50 68user Exp $ * * connect(2) とシグナルの実験 * * written by 68user http://X68000.q-e-d.net/~68user/ */ #include #include #include #include #include #include #include #include #include #include #include void sig_handler(int sig){ printf("シグナル %d (%s) 受信\n", sig, strsignal(sig)); } void usage(){ fprintf(stderr, "tcp-connect-signal [--retry --use-handler] (SIGALRM | SIGWINCH)\n"); exit(1); } int main(int argc, char *argv[]){ /* 接続先。タイムアウトになるような IP アドレスを指定すること */ char host[] = "192.168.33.44"; unsigned short port = 80; struct hostent *servhost; struct sockaddr_in server; int s; int ret; int will_retry = 0; int use_handler = 0; while ( argc> 2 ){ if ( strcmp(argv[1], "--retry") == 0 ){ will_retry = 1; } else if ( strcmp(argv[1], "--use-handler") == 0 ){ use_handler = 1; } else { usage(); } argc--; argv++; } if ( argc != 2 || ( strcmp(argv[1], "SIGALRM") != 0 && strcmp(argv[1], "SIGWINCH") != 0 ) ){ usage(); return 1; } if ( strcmp(argv[1], "SIGALRM") == 0 ){ if ( use_handler ){ printf("SIGALRM のシグナルハンドラをセットしました\n"); signal(SIGALRM, sig_handler); } alarm(3); printf("alarm を実行しました。3秒後に SIGALRM が飛んでくるはずです。\n"); } else { char buf[256]; int ret; sprintf(buf, "(sleep 3; kill -WINCH %d ) &", getpid()); ret = system(buf); if ( ret != 0 ){ fprintf(stderr, "system(3) でエラー発生。SIGWINCH を送信できません [%s]\n", strerror(errno)); } printf("[%s] を実行しました。3秒後に SIGWINCH が飛んでくるはずです。\n", buf); if ( use_handler ){ printf("SIGWINCH のシグナルハンドラをセットしました\n"); signal(SIGWINCH, sig_handler); } } servhost = gethostbyname(host); if ( servhost == NULL ){ fprintf(stderr, "[%s] から IP アドレスへの変換に失敗しました。\n", host); return 1; } bzero(&server, sizeof(server)); server.sin_family = AF_INET; bcopy(servhost->h_addr, &server.sin_addr, servhost->h_length); server.sin_port = htons(port); RETRY: if ( ( s = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){ fprintf(stderr, "ソケットの生成に失敗しました [%s]\n", strerror(errno)); return 1; } printf("%s:%d に connect します。\n", host, port); ret = connect(s, (struct sockaddr *)&server, sizeof(server)); if ( ret == -1 ){ int err = errno; fprintf(stderr, "connect に失敗しました [%s]\n", strerror(errno)); if ( err == EINTR && will_retry ){ fprintf(stderr, "システムコールが割り込まれたので再実行します\n"); goto RETRY; } return 1; } /* 後始末省略 */ return 0; }

AltStyle によって変換されたページ (->オリジナル) /