Created
October 19, 2021 03:48
-
-
Save hamzahkhan/95fb3829d693d6b3e9e9d60f3da56bbb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/mman.h> | |
#include <fcntl.h> | |
#include <sys/stat.h> | |
#include <unistd.h> | |
void printLab4(int n, int a, int *fibo) | |
{ | |
int i; | |
for (i = 0; i < n; i++) | |
printf("%d -> %d\n", i, fibo[i]); | |
} | |
void computeLab4(int n, int a, int *fibo) | |
{ | |
int i; | |
for (i = 0; i < n; i++) | |
{ | |
int sleepSec = rand() % 10; | |
printf("sleeping for %d : ", sleepSec); | |
sleep(sleepSec); | |
fibo[i] = i * a; | |
// randomly sleeping for 0-10 secs | |
printf("Generated new element %d after %d seconds \n", fibo[i], sleepSec); | |
} | |
} | |
int main(int argc, char *argv[]) | |
{ | |
pid_t childPID; | |
int status; | |
int shm_fd; | |
int *shared_memory; | |
int msize; // the size (in bytes) of the shared memory segment | |
const char *name = "Lab_4"; | |
int n, a; | |
if (argc != 3) | |
{ | |
fprintf(stderr, "usage: %s <Lab4 Seq to be generated>\n", argv[0]); | |
return -1; | |
} | |
n = atoi(argv[1]); | |
a = atoi(argv[2]); | |
printf("%d \n", n); | |
printf("%d \n", a); | |
if (n < 0 || a < 0) | |
{ | |
fprintf(stderr, "Illegal number: %s\n", argv[1]); | |
return -2; | |
} | |
// calculating the array size based on the number of terms being passed from child to parent | |
msize = (n + 2) * sizeof(int); | |
// open the memory | |
shm_fd = shm_open(name, O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG); | |
if (shm_fd < 0) | |
{ | |
fprintf(stderr, "Error in shm_open()"); | |
return -3; | |
} | |
printf("Created shared memory object %s\n", name); | |
// attach the shared memory segment | |
ftruncate(shm_fd, msize); | |
printf("shmat returned\n"); | |
// allocating the shared memory | |
shared_memory = (int *)mmap(NULL, msize, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); | |
if (shared_memory == NULL) | |
{ | |
fprintf(stderr, "Error in mmap()"); | |
return -3; | |
} | |
printf("Shared memory segment allocated correctly (%d bytes).\n", msize); | |
shared_memory[0] = n; | |
shared_memory[1] = a; | |
childPID = fork(); | |
if (childPID == -1) | |
{ | |
fprintf(stderr, "Cannot proceed. fork() error"); | |
return -4; | |
} | |
if (childPID == 0) | |
{ | |
// then we're the child process | |
computeLab4(shared_memory[0], shared_memory[1], shared_memory + 1); | |
exit(0); | |
} | |
else | |
{ | |
// parent will wait until the child finished | |
wait(&status); | |
// print the final results in the | |
printLab4(shared_memory[0], shared_memory[1], shared_memory + 1); | |
// now detach the shared memory segment | |
shm_unlink(name); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment