Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

CODE in C. Please look at the instructions before pasting your OLD answer. In th

ID: 3885634 • Letter: C

Question

CODE in C. Please look at the instructions before pasting your OLD answer.

In this assignment, you will create 4 processes. Each of these processes will share a variable called "total". Each will increment the variable “total” by one to 100,000, 200,000, 300,000 and 500,000 respectively. Make sure that only the newly created child calls the function “process#()”

After all the children have finished, the parent process should release the shared memory and terminate. Use the "wait" function so that the parent knows precisely when each of the children finishes. The parent should print the process id of each child as the child finishes execution. Then it should release shared memory and print "End of Program".

You need to run the program several times and analyze your observations (write report).

Sample output

From Process 1: counter = 270547.

From Process 2: counter = 347860.

From Process 3: counter = 400001.

From Process 4: counter = 500000.

Child with ID: 2412 has just exited.

Child with ID: 2411 has just exited.

Child with ID: 2413 has just exited.

Child with ID: 2415 has just exited.

                End of Simulation.

Instructions:

Use this as header:

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

/* key number */

#define SHMKEY ((key_t) 1497)

Create this typedef for your variable:

typedef struct{

int value;

} shared_mem;

shared_mem *total;

Have these Variables:

int shmid, pid1,pid2, pid3,pid4, ID,status;

char *shmadd;

shmadd = (char *) 0;

Use this code to create and connect shared memory segment:

if ((shmid = shmget (SHMKEY, sizeof(int), IPC_CREAT | 0666)) < 0){

perror ("shmget");

exit (1);

}

if ((total = (shared_mem *) shmat (shmid, shmadd, 0)) == (shared_mem *) -1){

perror ("shmat");

exit (0);

}

Initialize shared memory to 0 using:

total->value = 0;

Create processes

if ((pid1 = fork()) == 0)
process1();

And then create addition processes.

Parent wait for child processes to finish and print ID of each child. As shown in the sample output.

To detach a shared memory, use shmdt(total):

total is the pointer returned by shmat()

if (shmdt(total) == -1) {
perror ("shmdt");
exit (-1);
}

To remove a shared memory, use shmctl(shmid,IPC_RMID, NULL); where

shmid is the shared memory ID returned by shmget()

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

/* key number */

#define SHMKEY ((key_t) 1497)

Explanation / Answer

The code is fixed


#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
/* key number */
#define SHMKEY ((key_t) 1497)

typedef struct{
int value;
} shared_mem;
shared_mem *total;

int shmid, pid1,pid2, pid3,pid4, ID,status;
char *shmadd;
shmadd = (char *) 0;

if ((shmid = shmget (SHMKEY, sizeof(int), IPC_CREAT | 0666)) < 0){
perror ("shmget");
exit (1);
}
if ((total = (shared_mem *) shmat (shmid, shmadd, 0)) == (shared_mem *) -1){
perror ("shmat");
exit (0);
}

total->value = 0;

if ((pid1 = fork()) == 0)
process1();
if (shmdt(total) == -1) {
perror ("shmdt");
exit (-1);
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote