USE C CODE (PLEASE TELL ME WHICH EDITOR YOU USED AND CAPTURE OUTPUTS)!
In this assignment, you will create 4 processes. Each of these processes will share a variable called “total”. Eachwill increment thevariable “total” by one to 100,000,200,000, 300,000and 500,000 respectively. Makesure that only the newly created child calls the function “process#()” Afterall the children have finished, the parent process should release the shared memory and terminate. Use the “wait” function so that the parent knowsprecisely when each ofthe children finishes. The parent should print the process id of each child as the child finishes execution.Then it shouldrelease shared memory and print “Endof Program”. You need torun program several times and analyze your observations
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.
HELP WITH THE CODE:
Header
#include
#include
#include
#include
#include
#include
#include
/* key number */
#define SHMKEY ((key_t) 1497)
KEY
Unix uses this key for identifying shared memory segments.
-A key is a value of type key_t.
-There are three ways to generate a key:
Do it yourself
Use function ftok()
Ask the system to provide a private key.
Do it yourself:
#define SHMKEY ((key_t) 1497)
Use ftok() to generate one for you:
key_t = ftok(char *path, int ID);
path is a path name (e.g., “./”)
ID is an integer (e.g., ‘a’)
Function ftok() returns a key of type key_t: Key = ftok(“./”, ‘x’);
Keys are global entities. If other processes know your key, they can access your shared memory.
Ask the system to provide a private key using IPC_PRIVATE
shared memory
typedef struct
{
int value;
} shared_mem;
shared_mem *total
;
process1 increases the value of shared variable “total“ * by some number
process2
process3
process4
Main function
int shmid, pid1,pid2, pid3,pid4, ID,status;
char*shmadd;
shmadd= (char *) 0;
/* Create and connect to a 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
total->value = 0;
Create processes
if((pid1 = fork()) == 0)
process1();
Create additional processes
Parent wait for child processes to finish and print ID of each child. Three ways:
wait(&status)
wait(NULL)
waitpid(pid1, NULL, 0);
printf(“Child %d pid has just exited.n”, pid1);
To detach a shared memory, use shmdt(total);
-total is the pointer returned byshmat()
if (shmdt(total) == -1) {
perror (“shmdt”);
exit (-1);
}
To remove a shared memory,use shmctl(shmid,IPC_RMID, NULL);
-shmid is the shared memory ID returned by shmget().
-After a shared memory is removed, it no longer exists.
NOTES
If you did not remove your shared memory segments (e.g., program crashes before the execution of shmctl()), they will be in the system forever. This will degrade the system performance.
Use the ipcs command to check if you have shared memory segments left in the system.
Use the ipcrm command to remove your shared memory segments.
Expert Answer
#include
#define SHMKEY ((key_t) 1497)
#define SHMKEY ((key_t) 1497)
Use ftok() to generate one for you:
key_t = ftok(char *path, int ID);
path is a path name (e.g., “./”)
ID is an integer (e.g., ‘a’)
Function ftok() returns a key of type key_t: Key = ftok(“./”, ‘x’);
shared memory
typedef struct
{
int value;
} shared_mem;
shared_mem *total
;process2
process3
process4
Main function
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)
Initialize shared memory to 0
total->value = 0;
Create processes
if((pid1 = fork()) == 0)
process1();
wait(&status)
wait(NULL)
waitpid(pid1, NULL, 0);
printf(“Child %d pid has just exited.n”, pid1);
To detach a shared memory, use shmdt(total);
-total is the pointer returned byshmat()
if (shmdt(total) == -1) {
perror (“shmdt”);
exit (-1);
}