C program to create a binary ppm file using parallel execution
Assignment 4
Rewrite your solution to Assignment 2 with changed requirements on parallel execution.
Requirement from previous assignment:
• The parent process waits for the child process to terminate before creating the next.
Replacement:
• The parent process will not wait for the child process to terminate before creating the
next process.
• The processes will do the calculation in parallel. Add some sleep time to simulate larger
calculation.
• The processes will write the data into the image file sequentially. This is coordinated by
the parent using signals.
• You can only use signal for inter-process communication.
Answer:
/* Title: Assignment #4 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <signal.h> #include <sys/types.h> void handler(int dummy){ }; char color[5][3]; int main (int argc, char *argv[]){ const int dimx = 1000, dimy = 1000; char buffer[]="P6\n1000 1000\n255\n"; int pid1,pid2,pid3,pid4,pid5,pid6,pid7,pid8,pid9,pid10; int row,col,space,n,fd,status; //accepting input arguments for(int i=2;i<7;i++){ if(strcmp(argv[i],"red")==0){ color[i][0]= 255;color[i][1]= 0;color[i][2]= 0; } if(strcmp(argv[i],"green")==0){ color[i][0]= 0;color[i][1]= 255;color[i][2]= 0; } if(strcmp(argv[i],"blue")==0){ color[i][0]= 0;color[i][1]= 0;color[i][2]= 255; } if(strcmp(argv[i],"yellow")==0){ color[i][0]= 255;color[i][1]= 255;color[i][2]= 0; } if(strcmp(argv[i],"orange")==0){ color[i][0]= 255;color[i][1]= 165;color[i][2]= 0; } if(strcmp(argv[i],"cyan")==0){ color[i][0]= 0;color[i][1]= 255;color[i][2]= 255; } if(strcmp(argv[i],"magenta")==0){ color[i][0]= 255;color[i][1]= 0;color[i][2]= 255; } if(strcmp(argv[i],"ocean")==0){ color[i][0]= 43;color[i][1]= 101;color[i][2]= 236; } if(strcmp(argv[i],"violet")==0){ color[i][0]= 138;color[i][1]= 43;color[i][2]= 226; } } fd = open(argv[1], O_CREAT|O_WRONLY|O_TRUNC, 0755); write(fd,&buffer , 17); pid1=fork(); if(pid1<0){ printf("error"); } else if(pid1==0){//child signal(SIGALRM, handler); // receives signal from parent pause();// pause until recieve signal for(n=0;n<dimy/10;n++){ for(space=0;space<(dimx/2);space++){ write(fd, &color[3], 3); } for(space=0;space<dimx/2;space++){ write(fd, &color[4], 3); } } } else{ sleep(1); // parents sleeps for 1 sec, letting child to reach pause kill(pid1,SIGALRM); sleep(10); exit(0); } pid2=fork(); if(pid2<0){ printf("error"); } else if(pid2==0){ signal(SIGALRM, handler); pause(); //sleep(1); for(n=0;n<dimy/10;n++){ for(space=0;space<(dimx/2);space++){ write(fd, &color[3], 3); } for(space=0;space<dimx/2;space++){ write(fd, &color[4], 3); } } } else{ sleep(2); kill(pid2,SIGALRM); sleep(9); exit(0); } pid3=fork(); if(pid3<0){ printf("error"); } else if(pid3==0){ signal(SIGALRM, handler); pause(); for(n=0;n<dimy/20;n++){ for(space=0;space<(dimx/2);space++){ write(fd, &color[3], 3); } for(space=0;space<dimx/2;space++){ write(fd, &color[4], 3); } } for (row=0;row<(dimy/20);row++){ for(space=0;space<dimx/4;space++){ write(fd, &color[3], 3); } for(space=0;space<((dimx/4)-row);space++){ write(fd, &color[3], 3); } for(col=0;col<(2*row);col++){ write(fd, &color[2], 3); } for(space=0;space<((dimx/4)-row);space++){ write(fd, &color[4], 3); } for(space=0;space<(dimx/4);space++){ write(fd, &color[4], 3); } } } else{ sleep(3); kill(pid3,SIGALRM); // send signal to child to do calculations sleep(8); exit(0); } pid4=fork(); if(pid4<0){ printf("error"); } else if(pid4==0){ signal(SIGALRM, handler); pause(); for (row=0;row<(dimy/10);row++){ for(space=0;space<dimx/4;space++){ write(fd, &color[3], 3); } for(space=0;space<((dimx/5)-(row));space++){ write(fd, &color[3], 3); } for(col=0;col<(100+(2*row));col++){ write(fd, &color[2], 3); } for(space=0;space<((dimx/5)-(row));space++){ write(fd, &color[4], 3); } for(space=0;space<(dimx/4);space++){ write(fd, &color[4], 3); } } } else{ sleep(4); kill(pid4,SIGALRM); sleep(7); exit(0); } pid5=fork(); if(pid5<0){ printf("error"); } else if(pid5==0){ signal(SIGALRM, handler); pause(); for (row=0;row<(dimy/10);row++){ for(space=0;space<dimx/4;space++){ write(fd, &color[3], 3); } for(space=0;space<((dimx/10)-row);space++){ write(fd, &color[3], 3); } for(col=0;col<(300+(2*row));col++){ write(fd, &color[2], 3); } for(space=0;space<((dimx/10)-row);space++){ write(fd, &color[4], 3); } for(space=0;space<(dimx/4);space++){ write(fd, &color[4], 3); } } } else{ sleep(1); kill(pid5,SIGALRM); sleep(6); exit(0); } pid6=fork(); if(pid6<0){ printf("error"); } else if(pid6==0){ signal(SIGALRM, handler); pause(); for (row=(dimy/10);row>0;row--){ for(space=0;space<(dimx/4);space++){ write(fd, &color[5], 3); } for(space=0;space<((dimx/10)-row);space++){ write(fd, &color[5], 3); } for(col=0;col<(300+(2*row));col++){ write(fd, &color[2], 3); } for(space=0;space<((dimx/10)-row);space++){ write(fd, &color[6], 3); } for(space=0;space<(dimx/4);space++){ write(fd, &color[6], 3); } } } else{ sleep(1); kill(pid6,SIGALRM); sleep(5); exit(0); } pid7=fork(); if(pid7<0){ printf("error"); } else if(pid7==0){ signal(SIGALRM, handler); pause(); for (row=(dimy/10);row>0;row--){ for(space=0;space<(dimx/4);space++){ write(fd, &color[5], 3); } for(space=0;space<((dimx/5)-(row));space++){ write(fd, &color[5], 3); } for(col=0;col<(100+(2*row));col++){ write(fd, &color[2], 3); } for(space=0;space<((dimx/5)-(row));space++){ write(fd, &color[6], 3); } for(space=0;space<(dimx/4);space++){ write(fd, &color[6], 3); } } } else{ sleep(1); kill(pid7,SIGALRM); sleep(4); exit(0); } pid8=fork(); if(pid8<0){ printf("error"); } else if(pid8==0){ signal(SIGALRM, handler); pause(); for (row=(dimy/20);row>0;row--){ for(space=0;space<(dimx/4);space++){ write(fd, &color[5], 3); } for(space=0;space<((dimx/4)-(row));space++){ write(fd, &color[5], 3); } for(col=0;col<((2*row));col++){ write(fd, &color[2], 3); } for(space=0;space<((dimx/4)-(row));space++){ write(fd, &color[6], 3); } for(space=0;space<(dimx/4);space++){ write(fd, &color[6], 3); } } for(n=0;n<(dimy/20);n++){ for(space=0;space<(dimx/2);space++){ write(fd, &color[5], 3); } for(space=0;space<(dimx/2);space++){ write(fd, &color[6], 3); } } } else{ sleep(1); kill(pid8,SIGALRM); sleep(4); exit(0); } pid9=fork(); if(pid9<0){ printf("error"); } else if(pid9==0){ signal(SIGALRM, handler); pause(); for(n=0;n<(dimy/10);n++){ for(space=0;space<(dimx/2);space++){ write(fd, &color[5], 3); } for(space=0;space<(dimx/2);space++){ write(fd, &color[6], 3); } } } else{ sleep(1); kill(pid9,SIGALRM); sleep(3); exit(0); } pid10=fork(); if(pid10<0){ printf("error"); } else if(pid10==0){ signal(SIGALRM, handler); pause(); for(n=0;n<(dimy/10);n++){ for(space=0;space<(dimx/2);space++){ write(fd, &color[5], 3); } for(space=0;space<(dimx/2);space++){ write(fd, &color[6], 3); } } } else{ sleep(1); kill(pid10,SIGALRM); exit(0); } return 0; }
Leave a reply