/***************************************************************************** * Systemprogrammierung I - Klausur vom Februar 2002 - Aufgabe 2 * * Datei: time.c * Autor: Goethe * Datum: 05.09.2005 *****************************************************************************/ /* includes */ #include #include #include #include #include #include #include /* Funktionsdeklarationen, globale Variablen */ void sigint_handler( int ); pid_t pid = 0; char* command; /* Funktion main */ int main( int argc, char* argv[] ) { struct sigaction action; time_t start, end; if( argc < 2 ) { fprintf( stderr, "usage: %s \n", argv[0] ); return -1; } command = argv[1]; /* für die Ausgabe im Signalhandler */ /* Signalbehandlung einrichten */ memset( &action, 0, sizeof(action) ); action.sa_handler = sigint_handler; sigemptyset( &action.sa_mask ); action.sa_flags = 0; /* wegen memset sollten die Flags schon 0 sein */ if( sigaction( SIGINT, &action, NULL ) == -1 ) { perror( "Signalhandler für SIGINT installieren\n" ); return -1; } /* Prozess zur Kommandoausführung erzeugen */ pid = fork(); /* Fehler bei Prozesserzeugung */ if( pid == -1 ) { perror( "Fehler bei Prozesserzeugung" ); return -1; } /* Sohnprozess */ else if( pid == 0 ) { /* Sohn soll SIGINT ignorieren */ memset( &action, 0, sizeof(action) ); action.sa_handler = SIG_IGN; sigemptyset( &action.sa_mask ); action.sa_flags = 0; if( sigaction( SIGINT, &action, NULL ) == -1 ) { perror( "Fehler beim Installieren des Signalhandlers" ); } /* Kommando ausführen */ execvp( argv[1], argv+1 ); /* Fehler */ perror( "Fehler beim Ausführen des Kommandos" ); return -1; } /* Vaterprozess */ else { /* Startzeit stoppen */ if( (start = time(NULL)) == (time_t)-1 ) { perror( "Fehler beim Stoppen der Startzeit" ); } /* auf Ende des zu messenden Progr. warten */ while( wait(NULL) == -1 ) { if( errno == EINTR ) continue; perror( "Warten auf Sohn-Prozess fehlgeschlagen" ); return -1; } /* Laufzeit feststellen und ausgeben */ if( (start == (time_t)-1) || ((end = time(NULL)) == (time_t)-1) ) { fprintf( stderr, "Fehler beim Messen der Laufzeit\n" ); } else printf( "Laufzeit von %s: %d\n", command, (int)(end - start) ); } return 0; } /* Ende Funktion main */ /* Handler-Funktion für SIGINT */ void sigint_handler( int sig ) { if( pid > 0 ) printf( "Programm %s läuft noch\n", command ); }