All pastes #564399 Raw Edit

SOE Lab1

public c v1 · immutable
·published 2007-06-13 16:07 UTC
rendered paste body
#include <unistd.h>#include <sys/wait.h>#include <sys/time.h>#include <sys/resource.h>#include <stdlib.h>#include <assert.h>#include <stdio.h>#include <signal.h>#include <string.h>#include <ctype.h>int ilosc = 0;time_t czas_sek = 0;suseconds_t czas_us = 0;void sigchld_handler(int sig) {    struct rusage ru;    pid_t pid;        memset(&ru,0,sizeof(ru));        while ((pid=wait4(0,0,WNOHANG,&ru))>0) {	if (ilosc<=0) {	    fprintf(stderr,"Blad w pogramie, ilosc <= 0!\n");	    exit (-1);	};	ilosc--;		czas_sek += ru.ru_utime.tv_sec;	czas_sek += ru.ru_stime.tv_sec;		czas_us += ru.ru_utime.tv_usec;	czas_us += ru.ru_stime.tv_usec;		printf("PID %d: czas wykonywania %ds %dmsec, wykorzystanie procesora %ds %dmsec\n",pid,	ru.ru_utime.tv_sec+ru.ru_stime.tv_sec,ru.ru_utime.tv_usec+ru.ru_stime.tv_usec,ru.ru_utime.tv_sec,ru.ru_utime.tv_usec);    }    };inline void usage(void){    fprintf(stderr,"Bledne uzycie\nUzycie: znak_od_a_do_z liczba_od_100_do_2000 liczba_od_1_do_100\n");};int main (int argc, char *argv[]){    char Z;    int t,k;    char line[128];        struct sigaction sa;            if ((argc!=2) || (atoi(argv[1])==0)) {	fprintf(stderr,"%s max_procesow\n",argv[0]);	return -1;    };        sa.sa_handler = sigchld_handler;    sigfillset(&(sa.sa_mask));    sa.sa_flags = SA_RESTART;        if (sigaction(SIGCHLD,&sa,0)!=0) {	perror("sigaction");	return -1;    }        while (fgets(line,128,stdin)!=0) {	if (strcmp(line,"exit\n")==0){	    while (ilosc>0)		pause();	    printf("Calkowity czas wykonywanie %dsek %dmsec\n",czas_sek,czas_us);	    return 0;	}		if (sscanf(line,"%c %d %d\n",&Z,&t,&k)!=3) {	    usage ();	    continue;	}		if ((t<100) || (t>2000) 	|| (k<1) || (k>100) 	|| (toupper(Z)<'A') || (toupper(Z)>'Z')) {	    usage();	    continue;		}		pid_t pid;		if (ilosc==atoi(argv[1])) {	    fprintf(stderr,"Za duzo procesow\n");	    continue;	}		if ((pid = fork()) == -1) {	    perror("fork");	    return -1;	};		if (pid>0) {	    printf("PID dziecka %d\n",pid);	    ilosc++;	} else { 	    unsigned int n;	    for (n=0; n<k; n++) {		putchar(Z);		fflush(stdout);		usleep(1000*t);	    }	    printf("\n");	    return 0;	}    }    return 0;};