📄 tcutil.c
字号:
#include <stdio.h>#include <math.h>#include <limits.h>#include <stdarg.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <mpi.h>#include "connectstuff.h"static void printTimeStamp( void ) { time_t t; struct tm * ltime; time( &t ); ltime = localtime( &t ); printf( "%04d-%02d-%02d %02d:%02d:%02d: ", 1900 + ltime->tm_year, ltime->tm_mon, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec ); fflush( stdout );}void safeSleep( double seconds ) { struct timespec sleepAmt = { 0, 0 }; int ret = 0; sleepAmt.tv_sec = floor( seconds ); sleepAmt.tv_nsec = 1e9 * ( seconds - floor( seconds ) ); ret = nanosleep( &sleepAmt, NULL ); if( ret == -1 ) { printf( "Safesleep returned early. Sorry\n" ); }}void printStackTrace() { static char cmd[512]; snprintf( cmd, 512, "/bin/sh -c \"/home/eellis/bin/pstack1 %d\"", getpid() ); system( cmd ); fflush( stdout );}void msg( const char * fmt, ... ) { va_list ap; va_start( ap, fmt ); printTimeStamp(); vprintf( fmt, ap ); fflush( stdout ); va_end( ap );}/* * You should free the string once you've used it */char * getPortFromFile( const char * fmt, ... ) { char fname[PATH_MAX]; char dirname[PATH_MAX]; char * retPort; va_list ap; FILE * fp; int done = 0; int count = 0; /* Just used for the NFS sync - not really a count */ retPort = (char * ) calloc( MPI_MAX_PORT_NAME + 1, sizeof( char ) ); va_start( ap, fmt ); vsnprintf( fname, PATH_MAX, fmt, ap ); va_end( ap ); srand( getpid() ); while( !done ) { count += rand(); fp = fopen( fname, "rt" ); if( fp != NULL ) { fgets( retPort, MPI_MAX_PORT_NAME, fp ); fclose( fp ); /* ignore bogus tag - assume that the real tag must be longer than 8 * characters */ if( strlen( retPort ) >= 8 ) { done = 1; } } if ( !done ) { int retcode; safeSleep( 0.1 ); /* force NFS to update by creating and then deleting a subdirectory. Ouch. */ snprintf( dirname, PATH_MAX, "%s___%d", fname, count ); retcode = mkdir( dirname, 0777 ); if( retcode != 0 ) { perror( "Calling mkdir" ); _exit( 9 ); } else { rmdir( dirname ); } } } return retPort;}/* * Returns the filename written to. Free this once you're done. */char * writePortToFile( const char * port, const char * fmt, ... ) { char * fname; va_list ap; FILE * fp; fname = (char *) calloc( PATH_MAX, sizeof( char ) ); va_start( ap, fmt ); vsnprintf( fname, PATH_MAX, fmt, ap ); va_end( ap ); fp = fopen( fname, "wt" ); fprintf( fp, "%s\n", port ); fclose( fp ); msg( "Wrote port <%s> to file <%s>\n", port, fname ); return fname;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -