**please do the following in c and make it compile and run. Thanks!!** In this a
ID: 3885280 • Letter: #
Question
**please do the following in c and make it compile and run. Thanks!!**
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 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.
The following are "clues" that can be used in the code, as a sort of skeleton:
Headers:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
global variable:
/* key number */
#define SHMKEY ((key_t) 1497)
typedef struct{
int value;
} shared_mem;
shared_mem *total;
and of in int main():
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();
//create additional processes
wait(&status) or waitpid(pid1, NULL, 0)
lif (shmdt(total) == -1) {
perror ("shmdt");
exit (-1); }
nshmctl(shmid, IPC_RMID, NULL);
Explanation / Answer
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void ChildProcess1(int *a);
void ChildProcess2(int *a);
void ChildProcess3(int *a);
void ChildProcess4(int *a);
void main(int argc, char *argv[])
{
int shmid;
int *total;
pid_t pid;
int status;
shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
if (shmid < 0) {
printf("shmget error (server) ");
exit(1);
}
total = (int *) shmat(shmid, NULL, 0);
if ((int) total == -1) {
printf("shmat error (server) ");
exit(1);
}
*total = 0;
printf("Server is about to fork a child process... ");
pid = fork();
if (pid < 0) {
printf("*** fork error (server) *** ");
exit(1);
}
else if (pid == 0) {
ChildProcess1(total);
exit(0);
}
pid = fork();
if (pid < 0) {
printf("fork error (server) ");
exit(1);
}
else if (pid == 0) {
ChildProcess2(total);
exit(0);
}
pid = fork();
if (pid < 0) {
printf("fork error (server) ");
exit(1);
}
else if (pid == 0) {
ChildProcess3(total);
exit(0);
}
pid = fork();
if (pid < 0) {
printf("fork error (server) ");
exit(1);
}
else if (pid == 0) {
ChildProcess4(total);
exit(0);
}
printf("Child with ID: %d has just exited ",wait(NULL));
printf("Child with ID: %d has just exited ",wait(NULL));
printf("Child with ID: %d has just exited ",wait(NULL));
printf("Child with ID: %d has just exited ",wait(NULL));
printf("Server has detected the completion of its child... ");
shmdt((void *) total);
printf("Server has detached its shared memory... ");
shmctl(shmid, IPC_RMID, NULL);
printf("Server has removed its shared memory... ");
printf("Server exits... ");
exit(0);
}
void ChildProcess1(int *a)
{
*a = *a + 100000;
printf("From Process 1: counter = %d ",*a);
}
void ChildProcess2(int *a)
{
*a = *a + 100000;
printf("From Process 2: counter = %d ",*a);
printf("Child with ID: %d has just exited ",getpid());
}
void ChildProcess3(int *a)
{
*a = *a + 100000;
printf("From Process 3: counter = %d ",*a);
}
void ChildProcess4(int *a)
{
*a = *a + 100000;
printf("From Process 4: counter = %d ",*a);
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.