Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
long unsigned factorial(unsigned int n);
long unsigned bubbleSort(unsigned int n);
long unsigned quickSearch(unsigned int n);
static long p_realt_secs = 0, c1_realt_secs = 0, c2_realt_secs = 0;
static long p_virtt_secs = 0, c1_virtt_secs = 0, c2_virtt_secs = 0;
static long p_proft_secs = 0, c1_proft_secs = 0, c2_proft_secs = 0;
static struct itimerval p_realt, c1_realt, c2_realt;
static struct itimerval p_virtt, c1_virtt, c2_virtt;
static struct itimerval p_proft, c1_proft, c2_proft;
int flag, parent_PID, child1_PID, child2_PID;
void sig_handler(int signo){
printf("Ηρθε σήμα!\n");
switch(signo){
case SIGVTALRM:
flag = getpid();
if(flag==parent_PID){
//printf("parent\n");
p_virtt_secs++;
}
if(flag==child1_PID){
//printf("paidi1\n");
c1_virtt_secs++;
}
if(flag==child2_PID){
//printf("paidi2\n");
c2_virtt_secs++;
}
//printf("\np_virtt_secs: %ld\nc1_virtt_secs: %ld\nc2_virtt_secs: %ld\n", p_virtt_secs, c1_virtt_secs, c2_virtt_secs);
break;
case SIGALRM:
flag = getpid();
if(flag==parent_PID){
//printf("pateras\n");
p_realt_secs++;
}
if(flag==child1_PID){
//printf("paidi1\n");
c1_realt_secs++;
}
if(flag==child2_PID){
//printf("paidi2\n");
c2_realt_secs++;
}
//printf("\np_realt_secs: %ld\nc1_realt_secs: %ld\nc2_realt_secs: %ld\n", p_realt_secs, c1_realt_secs, c2_realt_secs);
break;
case SIGPROF:
flag = getpid();
if(flag==parent_PID){
//printf("pateras\n");
p_proft_secs++;
}
if(flag==child1_PID){
//printf("paidi1\n");
c1_proft_secs++;
}
if(flag==child2_PID){
//printf("paidi2\n");
c2_proft_secs++;
}
//printf("\np_proft_secs: %ld\nc1_proft_secs: %ld\nc2_proft_secs: %ld\n", p_proft_secs, c1_proft_secs, c2_proft_secs);
break;
default:
break;
}
}
/* Αυτά δεν θα μπούν στον κώδικά μας απλά για βοήθεια είναι! */
/*
struct itimerval {
struct timeval it_interval; // next value
struct timeval it_value; // current value
};
*/
/*
struct timeval {
long tv_sec; // seconds
long tv_usec; // microseconds
};
*/
int main(int argc, char **argv)
{
long unsigned res = 0;
int pid1, pid2;
unsigned int funarg;
int status;
/* get command line argument, funarg */
if(argc != 2){ /* no main argument given */
printf("No main-argument given. Try again and you may be lucky...\n");
exit(1);
}
funarg = atoi(argv[1]); /* main arguments -> char MUST be integers */
/* initialize parent REAL timers */
p_realt.it_interval.tv_sec = 1;
p_realt.it_interval.tv_usec = 0;
p_realt.it_value.tv_sec = 1;
p_realt.it_value.tv_usec = 0;
/* initialize parent VIRTUAL timers */
p_virtt.it_interval.tv_sec = 1;
p_virtt.it_interval.tv_usec = 0;
p_virtt.it_value.tv_sec = 1;
p_virtt.it_value.tv_usec = 0;
/* initialize parent PROF timers */
p_proft.it_interval.tv_sec = 1;
p_proft.it_interval.tv_usec = 0;
p_proft.it_value.tv_sec = 1;
p_proft.it_value.tv_usec = 0;
/* initialize child1 REAL timers */
c1_realt.it_interval.tv_sec = 1;
c1_realt.it_interval.tv_usec = 0;
c1_realt.it_value.tv_sec = 1;
c1_realt.it_value.tv_usec = 0;
/* initialize child1 VIRTUAL timers */
c1_virtt.it_interval.tv_sec = 1;
c1_virtt.it_interval.tv_usec = 0;
c1_virtt.it_value.tv_sec = 1;
c1_virtt.it_value.tv_usec = 0;
/* initialize child1 PROF timers */
c1_proft.it_interval.tv_sec = 1;
c1_proft.it_interval.tv_usec = 0;
c1_proft.it_value.tv_sec = 1;
c1_proft.it_value.tv_usec = 0;
/* initialize child2 REAL timers */
c2_realt.it_interval.tv_sec = 1;
c2_realt.it_interval.tv_usec = 0;
c2_realt.it_value.tv_sec = 1;
c2_realt.it_value.tv_usec = 0;
/* initialize child2 VIRTUAL timers */
c2_virtt.it_interval.tv_sec = 1;
c2_virtt.it_interval.tv_usec = 0;
c2_virtt.it_value.tv_sec = 1;
c2_virtt.it_value.tv_usec = 0;
/* initialize child2 PROF timers */
c2_proft.it_interval.tv_sec = 1;
c2_proft.it_interval.tv_usec = 0;
c2_proft.it_value.tv_sec = 1;
c2_proft.it_value.tv_usec = 0;
/* enable your signal handlers for the parent */
signal(SIGALRM, sig_handler); // συναγερμός
signal(SIGVTALRM, sig_handler); // λήξη εικονικού χρονιστή
signal(SIGPROF, sig_handler); // λήξη χρονιστή προφίλ
/* set the parent's itimers */
setitimer(ITIMER_REAL, &p_realt, NULL); /* πραγματικός χρόνος πατέρα*/
setitimer(ITIMER_VIRTUAL, &p_virtt, NULL); /* χρόνος που εκτελέστηκε η διεργασία */
setitimer(ITIMER_PROF, &p_proft, NULL); /* χρόνος που χρησιμοποιήσε η ο πυρήνας την CPU */
pid1 = fork();
if(pid1 == 0){ /* child1 */
child1_PID = getpid();
/* enable child 1 signal handlers (disable parent handlers) */
signal(SIGALRM, sig_handler); // συναγερμός
signal(SIGVTALRM, sig_handler); // λήξη εικονικού χρονιστή
signal(SIGPROF, sig_handler); // λήξη χρονιστή προφίλ
/* set the child 1 timers */
setitimer(ITIMER_REAL, &c1_realt, NULL); /* πραγματικός χρόνος πατέρα*/
setitimer(ITIMER_VIRTUAL, &c1_virtt, NULL); /* χρόνος που εκτελέστηκε η διεργασία */
setitimer(ITIMER_PROF, &c1_proft, NULL); /* χρόνος που χρησιμοποιήσε η ο πυρήνας την CPU */
/* start yourfunction() at child1 */
//printf("BuubleSort function...\n");
res = bubbleSort(funarg);
/*Read the child 1 itimer values and report them */
getitimer(ITIMER_PROF, &c1_realt);
getitimer(ITIMER_REAL, &c1_virtt);
getitimer(ITIMER_VIRTUAL, &c1_proft);
printf("\n");
printf("About the CHILD-1...\n");
printf("Real -> %ld sec\n", c1_realt_secs);
printf("CPU(proft) -> %ld sec\n", c1_proft_secs);
printf("User(virtt) -> %ld sec\n", c1_virtt_secs);
//printf("Kernel -> %ld sec\n", p_proft_secs-c1_virtt_secs);
fflush(stdout);
exit(0);
}else{
pid2 = fork();
if(pid2 == 0){ /* 2o child */
child2_PID = getpid();
/* enable the child 2 signal handlers (disable parent handlers) */
signal(SIGALRM, sig_handler); // συναγερμός
signal(SIGVTALRM, sig_handler); // λήξη εικονικού χρονιστή
signal(SIGPROF, sig_handler); // λήξη χρονιστή προφίλ
/* set the child 2 itimers */
setitimer(ITIMER_REAL, &c2_realt, NULL); // πραγματικός χρόνος πατέρα
setitimer(ITIMER_VIRTUAL, &c2_virtt, NULL); // χρόνος που εκτελέστηκε η διεργασία
setitimer(ITIMER_PROF, &c2_proft, NULL); // χρόνος που χρησιμοποιήσε η ο πυρήνας την CPU
/* start yourfunction() at child1 */
//printf("\nFactorial function...\n");
res = factorial(funarg);
/* Read the child 1 itimer values and report them */
getitimer(ITIMER_PROF, &c2_realt);
getitimer(ITIMER_REAL, &c2_virtt);
getitimer(ITIMER_VIRTUAL, &c2_proft);
printf("About the CHILD-2...\n");
printf("Real -> %ld sec\n", c2_realt_secs);
printf("CPU(proft) -> %ld sec\n", c2_proft_secs);
printf("User(virtt) -> %ld sec\n", c2_virtt_secs);
printf("Kernel -> %ld sec\n", p_proft_secs-c1_virtt_secs);
printf("\n");
fflush(stdout);
exit(0);
}else{ /* parent */
parent_PID = getpid();
/* enable the parent signal handlers */
signal(SIGALRM, sig_handler); // συναγερμός
signal(SIGVTALRM, sig_handler); // λήξη εικονικού χρονιστή
signal(SIGPROF, sig_handler); // λήξη χρονιστή προφίλ
/* set the parent itimers */
setitimer(ITIMER_REAL, &p_realt, NULL); // πραγματικός χρόνος πατέρα
setitimer(ITIMER_VIRTUAL, &p_virtt, NULL); // χρόνος που εκτελέστηκε η διεργασία
setitimer(ITIMER_PROF, &p_proft, NULL); // χρόνος που χρησιμοποιήσε η ο πυρήνας την CPU
/* start your function at the parent */
//printf("QuickSearch function...\n");
res = quickSearch(funarg);
/* wait for the children to terminate */
//printf("Waitting to end the child1 & child2...\n");
waitpid(0, &status, 0);
waitpid(0, &status, 0);
/* read the parent itimer values and report them */
getitimer(ITIMER_PROF, &p_realt);
getitimer(ITIMER_REAL, &p_virtt);
getitimer(ITIMER_VIRTUAL, &p_proft);
printf("\n");
printf("About the PARENT...\n");
printf("Real -> %ld sec\n", p_realt_secs);
printf("CPU(proft) -> %ld sec\n", p_proft_secs);
printf("User(virtt) -> %ld sec\n", p_virtt_secs);
printf("Kernel -> %ld sec\n", p_proft_secs-c1_virtt_secs);
fflush(stdout);
exit(0);
}
printf("this line should never be printed\n");
printf("\n");
}
}/* end of main */
// ----------------------------------------------------------
long unsigned factorial(unsigned int n) {
int i, flag = 1;
for(i=1; i<n; i++){
flag = flag * i;
}
return flag;
}
// ----------------------------------------------------------
// ----------------------------------------------------------
long unsigned int recurce(unsigned int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return recurce(n-1) + recurce(n-2);
}
}
long unsigned int alwaysexecuting(unsigned int n) {
alarm(6);
while(1);
}
// ----------------------------------------------------------
// -----------------------------------------------------------
long unsigned int bubbleSort(unsigned array_size)
{
int i, j, temp;
int *numbers;
numbers = (int *)malloc(array_size*sizeof(int));
if(numbers == NULL){
printf("Malloc failed ! ! ! \n");
return 1;
}
for (i = (array_size - 1); i > 0; i--){
for (j = 1; j <= i; j++){
if (numbers[j-1] > numbers[j]){
temp = numbers[j-1];
numbers[j-1] = numbers[j];
numbers[j] = temp;
}
}
}
return 0;
}
// ----------------------------------------------------------
// ----------------------------------------------------------
long unsigned int quickSearch(unsigned n){
int flag, i;
struct timeval opcode;
for(i=0; i<n; i++){
if(n>i){
for(i=0; i<n; i++){
gettimeofday(&opcode,NULL);
}
return (n+1);
}
}
return 1;
}
// ----------------------------------------------------------
// ----------------------------------------------------------
long unsigned int yourfunction12(unsigned int n){
int i;
FILE *pFile;
pFile = fopen ("myfile.txt","w");
if (pFile != NULL){
fputs ("fopen example\n", pFile);
fclose (pFile);
for(i=0; i<99; i++){ }
}else{
exit(1);
}
return 0;
}
// ----------------------------------------------------------