In: Computer Science
Modify the below program so that the following two conditions are met:
1. Each child terminates abnormally after attempting to write to a location in the read-only text segment.
2. The parent prints output that is identical (except for the PIDs) to the following:
child 12255 terminated by signal 11: Segmentation fault
child 12254 terminated by signal 11: Segmentation fault
Hint: Read the man page for psignal(3)
___________________________________.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
void unix_error(char *msg) /* unix-style error */
{
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}
#define N 2
int main()
{
int status, i;
__pid_t pid;
/* Parent creates N children */
for (i = 0; i < N; i++)
if ((pid = fork()) == 0) /* child */
exit(100+i);
/* Parent reaps N children in no particular order */
while ((pid = waitpid(-1, &status, 0)) > 0) {
if (WIFEXITED(status))
printf("child %d terminated normally with exit status=%d\n",
pid, WEXITSTATUS(status));
else
printf("child %d terminated abnormally\n", pid);
}
/* The normal termination is if there are no more children */
if (errno != ECHILD)
unix_error("waitpid error");
exit(0);
}
Answer:
Please find the complete program for the question below.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
/* psignal */
#include <sys/types.h> /* waitpid */
#include <sys/wait.h> /* waitpid */
#define N 2
int main() {
int status, i;
pid_t pid[N],
retpid;
/* Parent creates N
children */
for(i = 0; i < N;
i++) {
if((pid[i] = fork()) == 0) { /* child */
strcpy("Hello", "World"); /* Writing on read-only
location. It creates SIGSEGV */
exit(100 + i);
}
}
/* Parent reaps N
children in order */
i = 0;
while ((retpid =
waitpid(pid[i++], &status, 0)) > 0) {
if(WIFEXITED(status))
printf("child %d terminated normally with exit status=%d\n",
retpid, WEXITSTATUS(status));
else if(WIFSIGNALED(status))
{
/* Exited with a signal */
printf("child %d terminated by signal %d: \n", retpid,
SIGSEGV);
psignal(WTERMSIG(status), NULL);
}
else
printf("child %d terminated abnormally \n", retpid);
}
/* The only normal
termination is if there are no more children */
if(errno !=
ECHILD)
printf("waitpid error");
exit(0);
}