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;};