/* 2016/09/24 1.0 新規作成 */ #include #include #include #include "MultiPing.h" int main( int argc, char** argv ) { // printf( "MultiPing_main start!!\n" ); if ( argc < 2 ) { printf( "MultiPing []\n" ); exit( 1 ); } int iMaxThreads = 10; if ( argc == 3 ) { iMaxThreads = atoi( argv[2] ); } int i, j; /* IPリストファイルを読み込む */ /* レイアウト:ホスト名,IPアドレス */ FILE *fp = fopen( argv[1], "r" ); if ( fp == NULL ) { printf( "Host list not found!! %s", argv[1] ); exit( 2 ); } HostInfo hi[HOST_LIMIT]; memset( hi, NULL, sizeof( hi ) ); int hiCnt=0; for ( i = 0; ; i++ ) { char buf[HOSTNAME_LEN+IP_LEN+1]; char *ret; /* ファイルを1行読み込む */ memset( buf, 0x00, sizeof( buf ) ); ret = fgets( buf, sizeof( buf ), fp ); if ( ret == NULL ) { break; } /* 改行コードを除去 */ for ( j = 0; j < ( int )strlen( buf ); j++ ) { if ( ( ( unsigned char )buf[j] == '\r' ) || ( ( unsigned char )buf[j] == '\n' ) ) { buf[j] = NULL; } } /* ,で区切り構造体配列へ格納する */ int iBufLen = strlen( buf ); for ( j = 0; j < iBufLen; j++ ) { if ( ( unsigned char )buf[j] == ',' ) { memcpy( hi[i].pIP, buf, j ); memcpy( hi[i].pHostName , buf + j + 1 , iBufLen - j ); break; } } hiCnt++; } fclose( fp ); int iRunThreads = 0; pthread_t *tid = ( pthread_t* )malloc( sizeof( pthread_t ) * iMaxThreads ); int ret = 0; int hiRun = 0; for ( hiRun = 0; hiRun < hiCnt; ) { /* スレッドを生成 */ iRunThreads = 0; for ( j = 0; j < iMaxThreads; j++ ) { /* printf( "hi:%d/%s/%s<\n" , hiRun , hi[hiRun].pHostName , hi[hiRun].pIP ); */ ret = pthread_create( &tid[j] , NULL , myThread , ( void* )&hi[hiRun] ); if ( ret != 0 ) { /* スレッド生成失敗 */ printf( "pthread_create failed!!=[%d]\n", ret ); exit( -1 ); } iRunThreads++; // printf( "thread ID=[%ld]\n", tid[j] ); hiRun++; if ( hiRun >= hiCnt ) { /* HostInfoの件数(hiCnt)より実行件数(hiRun) */ /* の方が同じか大きい場合、処理はおしまい。 */ break; } } /* 生成したスレッドの数だけスレッドの終了を待つ */ for ( j = 0; j < iRunThreads; j++ ) { pthread_join( tid[j], NULL ); } } free( tid ); // printf( "MultiPing_main end!!\n" ); return 0; }