Study the code and explain the communication process include
Study the code and explain the communication process. #include <sys/shm.h> #include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define MAX_SEQUENCE 10 // Max values to store in shared memory #define MIN_SEQUENCE 2 // Min value the user can enter //shared memory: // 1) holds an array of numbers // 2) holds how many numbers are in the array typedef struct { int fib_seq[MAX_SEQUENCE]; int sequence_size; } shared_data; //MAIN function int main(int argc, char *argv[]) { pid_t pid; //process ID int segment_id; //Shared Memory ID shared_data *mem; //Shared Memory Pointer //check to validate atleast two arguments if(argc != 2) { printf(\"USAGE ERROR: [0-9]\ \"); exit(0); } //validate the input is not larger then the MAX if(atoi(argv[1]) > MAX_SEQUENCE) { printf(\"Max Input Size: %d\ \", MAX_SEQUENCE); exit(0); } //validate the input is not smaller then the MIN if(atoi(argv[1]) < MIN_SEQUENCE) { printf(\"Min Input Size: %d\ \", MIN_SEQUENCE); exit(0); } // 1) // 2) // 3) segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR|S_IWUSR); // mem = (shared_data *) shmat(segment_id,NULL,0); // mem->sequence_size = atoi(argv[1]); // fork a child process pid = fork(); if(pid < 0) { /* error occured */ fprintf(stderr, \"Fork Failed\ \"); return 1; } else if(pid == 0) { /* child process */ int counter = 0; printf(\"Child Fibonacci Sequence: \"); while(counter < mem->sequence_size) { if(counter == 0){ //FIB of zero is always zero mem->fib_seq[counter] = 0; } else if(counter == 1){ //FIB of one is always one mem->fib_seq[counter] = 1; } else { //The Fibonacci Sequence formula \'R = fib(n-1) + fib(n-2)\' //The first two numbers in the sequence are always 0 and 1. //To get a value in the sequence you will want to take the previous //two numbers and add them together. For example: // b + a = c // [fib(d-1) = c] + [fib(d-2) = b] = R // fib(0) = 0 // fib(1) = 1 // fib(2): 1 + 0 = 1 // fib(3): 1 + 1 = 2 // fib(4): 2 + 1 = 3 // fib(5): 3 + 2 = 5 // The next Fibonacci number in the sequence will be \'8\' mem->fib_seq[counter] = mem->fib_seq[counter - 1] + mem->fib_seq[counter - 2]; } printf(\"%d \", mem->fib_seq[(counter)]); counter++; } } else { /* parent process */ // wait(NULL); //Print out shared memory int count = 0; printf(\"\ Parent Fibonacci Sequence: \"); while(count < mem->sequence_size){ printf(\"%d \", mem->fib_seq[count]); count++; } // shmdt(mem); //remove shared memory segment shmctl(segment_id,IPC_RMID,NULL); printf(\"\ Complete\ \"); } return 0; } Solution
A)
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX_SEQUENCE 10
#define MIN_SEQUENCE 2
typedef struct {
int fib_seq[MAX_SEQUENCE];
int sequence_size;
} shared_data;
int main(int argc, char *argv[]) {
pid_t pid;
int segment_id;
shared_data *mem;
if(argc != 2) {
printf(\"USAGE ERROR: [0-9]\ \");
exit(0);
}
if(atoi(argv[1]) > MAX_SEQUENCE) {
printf(\"Max Input Size: %d\ \", MAX_SEQUENCE);
exit(0);
}
if(atoi(argv[1]) < MIN_SEQUENCE) {
printf(\"Min Input Size: %d\ \", MIN_SEQUENCE);
exit(0);
}
segment_id = shmget(IPC_PRIVATE, sizeof(shared_data), S_IRUSR|S_IWUSR);
mem = (shared_data *) shmat(segment_id,NULL,0);
mem->sequence_size = atoi(argv[1]);
pid = fork();
if(pid < 0) { /* error occured */
fprintf(stderr, \"Fork Failed\ \");
return 1;
}
else if(pid == 0) { /* child process */
int counter = 0;
printf(\"Child Fibonacci Sequence: \");
while(counter < mem->sequence_size) {
if(counter == 0){
mem->fib_seq[counter] = 0;
}
else if(counter == 1){
mem->fib_seq[counter] = 1;
}
else {
mem->fib_seq[counter] = mem->fib_seq[counter - 1] + mem->fib_seq[counter - 2];
}
printf(\"%d \", mem->fib_seq[(counter)]);
counter++;
}
}
else { /* parent process */
wait(NULL);
int count = 0;
printf(\"\ Parent Fibonacci Sequence: \");
while(count < mem->sequence_size){
printf(\"%d \", mem->fib_seq[count]);
count++;
}
shmdt(mem);
shmctl(segment_id,IPC_RMID,NULL);
printf(\"\ Complete\ \");
}
return 0;
}

