Question & Answer: USE C CODE (PLEASE TELL ME WHICH EDITOR YOU USED AND CAPTURE OUTPUTS)!…..

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);

}

Still stressed from student homework?
Get quality assistance from academic writers!