Читайте также:
|
|
Каждый процесс имеет свое собственное виртуальное адресное пространство. ОС Linux хранит адреса виртуальной памяти каждого процесса. Эти адреса доступны процессу и могут быть получены из глобальных переменных exent, edata, end (рис. 2).
Задание 6.
6.1. Используя начальную версию программы procmemory.c, зарисуйте в отчете распределение памяти процесса, как это сделано на рис. 2. Покажите на рисунке расположение и адреса main, showit, cptr, buffer1, i и память, выделенную в куче для buffer2.
6.2. Вставьте в программу системный вызов fork после оператора int i=0. Что будет напечатано? Убедитесь, что данные (например, i) в обоих процессах имеют одинаковые виртуальные адреса.
/* procmemory.c */
/* Program to display address information about the process */
/* Adapted from Gray, J.S., Interprocess Communication in UNIX: The Nooks & Crannies, Prentice-Hall, 1997, program 1.4 */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
/* Below is a macro definition */
#define SHW_ADR(ID,I) (printf("ID %s \t is at virt.address: %8X\n", ID,&I))
extern int etext, edata, end; /* Global variables for process memory */
char *cptr = "This message is output by showit()\n"; /* Static */
char buffer1[25];
int showit (); /* Function prototype */
main ()
{
int i = 0; /* Automatic variable */
/* Printing addressing information */
printf ("\nAddress etext: %8X \n", &etext);
printf ("Address edata: %8X \n", &edata);
printf ("Address end: %8X \n", &end);
SHW_ADR ("main", main);
SHW_ADR ("showit", showit);
SHW_ADR ("cptr", cptr);
SHW_ADR ("buffer1", buffer1);
SHW_ADR ("i", i);
strcpy (buffer1, "A demonstration\n"); /* Library function */
write (1, buffer1, strlen(buffer1) + 1); /* System call */
showit(cptr);
} /* end of main function */
/* A function follows */
int showit (p)
char * p;
{
char *buffer2;
SHW_ADR("buffer2", buffer2);
if ((buffer2 = (char *)malloc ((unsigned) (strlen(p) + 1)))!= NULL)
{
printf("Alocated memory at %X\n", buffer2);
strcpy (buffer2, p); /* copy the string */
printf ("%s", buffer2); /* Didplay the string */
free (buffer2); /* Release location */
}
else
{
printf ("Allocation error\n");
exit (1);
}
}
Дата добавления: 2014-12-18; просмотров: 42 | Поможем написать вашу работу | Нарушение авторских прав |