Question: Write a C program called time.c that determines the amount of time necessary to run a command from the command line. This program will be
Write a C program called time.c that determines the amount of time necessary to run a command from the command line. This program will be run as ./time
The general strategy is to fork a child process that will execute the specified command. However, before the child executes the command, it will record a timestamp of the current time (which we term starting time). The parent process will wait for the child process to terminate. Once the child terminates, the parent will record the current timestamp for the ending time. The difference between the starting and ending times represents the elapsed time to execute the command. The example output below reports the amount of time to run the command ls:
./time ls
time.c
Time
Elapsed time: 0.25422
As the parent and child are separate processes, they will need to arrange how the starting time will be shared between them. You will write two versions of this program, each representing a different method of IPC.
The first version will have the child process write the starting time to a region of shared memory before it calls exec(). After the child process terminates, the parent will read the starting time from shared memory. Refer to Section 3.7.1 for details using POSIX shared memory. In that section, there are separate programs for the producer and consumer. As the solution to this problem requires only a single program, the region of shared memory can be established before the child process is forked, allowing both the parent and child processes access to the region of shared memory.
Hints:
- you will use the shared memory to store the timestamps.
- Using fork() to create a child process and record the starting time into the shared memory. Using exec() function to execute a command.
- In the parent process, wait() until the child process terminates; record the ending time and compute the elapsed time.
- The sample code for creating shared memory is Fig 3.16 in Section 3.7.1.
- The libraries you will use are:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
FIG3.16
#include
#include
#include
#include
#include
#include
#include
int main() {
/*the size ( in bytes) of shared memory object*/
const int SIZE = 4096;
/*name of the shared memory object*/
const char *name = "OS";
/*strings written to shared memory*/
const char *message_0 = "Hello";
const char *message_1 = "Wolrd";
/*shared memory file descriptor */
int fd;
/* pointer to shred memory object */
char *ptr;
/* create the shared memory object */
fd = shm_open(name,O_CREAT | O_RDWR, 0666);
/*configure the size of the shared memory object */
ftruncate(fd, SIZE);
/*memory map the shared memory object */
ptr = (char *)
mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/* Write to the shared memory object */
sprintf(ptr, "%s", message_0);
ptr += strlen(message_0);
sprintf(ptr, "%s", message_1);
ptr += strlen(message_1);
return 0;
}
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
