I write a program containing two processes: the first one contains a group of two semaphores and creates the child process that reads all data in the shared memory segment and prints them.
In the second one, the child process computes the data using a compute function that returns 0 when all data are computed. It transmits them to the parent through the shared memory segment.
To write data:
On the 1st semaphore the child makes P and the parent make V.
On the 2nd semaphore the child makes V and the parent make P.
But as I'm new in this topic and still getting hardness to understand, it seems like I'm doing something wrong because it's not working as it has to be.
Here is my code:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <semaphore.h> #include <sys/shm.h> #include <errno.h> #include <sys/wait.h> int sum =0; int compute(int data){ sum += data; return sum; } int main(){ int i; int shm_id; int data; pid_t pid; key_t shm_key; sem_t *sem; // unsigned int sem_value =2; shm_key = ftok("/dev/null", 65); shm_id = shmget(shm_id, sizeof(int), 0644 | IPC_CREAT); if (shm_id < 0){ perror("shmgget"); exit(EXIT_FAILURE); } // data = shmat(shm_id, NULL, 0); sem = sem_open("semaphore", O_CREAT | O_EXCL, 0644, 2); for (i = 0; i < 2; i++){ pid = fork(); if (pid < 0) { perror("fork"); sem_unlink("semaphore"); sem_close(sem); exit(EXIT_FAILURE); } else if (pid == 0) { break; } } if (pid == 0) { puts("Enter the data:"); scanf("%d", &data); //child process sem_wait(sem); printf("Child - %d is in critical section\n", i); sleep(1); puts("Enter the data:"); scanf("%d", &data); // *shrd_value += data; printf("Child - %d: new value of data = %d\n", i, data); printf("Child - %d: sum of whole data by far = %d\n", i, compute(data)); sem_post(sem); exit(EXIT_SUCCESS); } else if (pid > 0) { //parent process while (pid = waitpid(-1, NULL, 0)) { if (errno == ECHILD) { break; } } puts("All children exited"); shmdt(&data); shmctl(shm_id, IPC_RMID, 0); sem_unlink("semaphore"); sem_close(sem); exit(0); } } Output:
Enter the data: Enter the data: 2 Child - 0 is in critical section 1Enter the data: Child - 1 is in critical section Enter the data: 3 Child - 0: new value of data = 3 Child - 0: sum of whole data by far = 3 2 Child - 1: new value of data = 2 Child - 1: sum of whole data by far = 2 All children exited