Está en la página 1de 8

Practica de Memoria

#include #include #include #include <stdio.h> <signal.h> <sys/time.h> <sys/resource.h>

char *p, *sbrk(); struct rlimit lim; void hand() { int m; printf("Seal SIGSEGV recibida \n"); printf("Valor de p a la recepcion de SIGSEGV: %u\n",p); exit(0); } void main() { signal(SIGSEGV,hand); printf("Tamao de la pagina: %d\n",getpagesize()); getrlimit(RLIMIT_DATA,&lim); printf("Limite logico: %u \n Limite fisico:%u\n",lim.rlim_cur,lim.rlim_max); p=sbrk(512); printf("Valor del punto de reuptura antes de sbrk: %u\n",p); p=sbrk(0); printf("Valor del punto de reuptura despues de sbrk: %u\n",p); while(1) *p++='a'; } /* Ejemplo que ilustra diferentes demandas de conexin para un mismo proceso de un segmento de memoria */ #include #include #include #include #include <stdio.h> <signal.h> <sys/types.h> <sys/ipc.h> <sys/shm.h>

#define TAMANO 512 #define CLAVE(key_t) 1000 int *shmat(); void hand(sig) int sig; { printf("seal %d recibida\n",sig); } main() { int shmid; // identificacin del segmento

int *adr1, *adr2; //las direcciones de conexin o enlace del segmento int i; for(i=0;i<NSIG;i++) signal(i,hand); if((shmid = shmget(CLAVE,TAMANO,IPC_CREAT | 0666)) == -1) { perror("shmget "); exit(2); } // Conexin a una direccin no fijada if((adr1 = shmat(shmid, 0, 0)) == (int *) -1) { perror("shmat 1 "); exit(2); } printf("direccin de conexin 1: %d\n", adr1); // Conexin a una direccin fijada incorrecta if((adr2 = shmat(shmid, adr1+1000, 0)) == (int *) -1) perror("shmat 2 "); else printf("direccin de conexin 2: %d\n", adr2); // Conexin a una direccin fijada para redondear e incorrecta if((adr2 = shmat(shmid, adr1+1000, SHM_RND)) == (int *) -1) perror("shmat 3 "); else printf("direccin de conexin 3: %d\n", adr2); // Conexin en lectura solo a una direccin fijada correcta if((adr2 = shmat(shmid, (char *)adr1+SHMLBA, SHM_RDONLY)) == (int *) -1) perror("shmat 4 "); else printf("direccin de conexin 4: %d\n", adr2); // Fase de inicializacin for(i=0;i<TAMANO/sizeof(int);i++) adr1[i] = i+1; srand(getpid()); // Acceso por la segunda direccin a un elemento i = rand() % (TAMANO/sizeof(int)); printf(" %d-isimo elemento = %d\n", i, adr2[i]); // Demanda de modificacin va adr2 ==> modificacin ilegal adr2[i] = 1+1000; printf(" %d-isimo elemento = %d\n", i, adr2[i]); }

#include #include #include #include

<stdio.h> <sys/types.h> <sys/ipc.h> <sys/shm.h>

#define TAMANO 512 #define CLAVE(key_t) 1000 main() { struct shmid__ds buf;

int n, shmid; int *adr1, *adr2, *shmat(); printf("Proceso del proceso\n"); system("ipcs -m"); putchar('\n'); shmid = shmget(CLAVE, TAMANO, IPC_CREAT | 0666); if(shmid == -1) { perror("llamada shmget "); exit(2); } printf("Despus de la creacin del segmento\n"); system("ipcs -m"); putchar('\n'); if((adr1 = shmat(shmid, 0, 0)) == (char *) -1) perror("shmat 1 "); else printf("Conexin 1 lograda\n"); if(shmctl(shmid, IPC_STAT, &buf) == -1) { perror("shmctl(STAT) "); exit(29); } printf("nmero de conexiones: %d\n", buf.shm_nattch); putchar('\n'); shmctl(shmid, IPC_RMID, 0); printf("Despus de la supresin del segmento\n"); system(2ipcs -m"); putchar('\n'); printf("Modificacin de adr1[5]"); adr1[5] = 100; printf("adr1[5] = %d\n", adr1[5]); putchar('\n'); if((adr2 = shmat(shmid, 0, 0)) == (char *) -1) perror("shmat 2 "); else printf("Conexin 2 lograda\n"); shmctl(shmid, IPC_STAT, &buf); printf("nmero de conexiones: %d\n", buf.shm_nattch); putchar('\n'); shmdt(adr1); system("ipcs -m"); }

#include #include #include #include

<stdio.h> <sys/types.h> <sys/ipc.h> <sys/shm.h>

#define NB 64 #define CLAVE(key_t) 1000 int *shmat();

main() { int shmid; // la identificacin del segmento int *adr; //las direccin de conexin del segmento int i; if((shmid = shmget(CLAVE, NB*sizeof(int), IPC_CREAT | 0666)) == -1) { perror("shmget "); exit(2); } // Conexin a una direccin no fijada if((adr = shmat(shmid, 0, SHM_RDONLY)) == (int *) -1) { perror("shmat "); exit(2); } srand(getpid()); for(i=0; i<NB; i++) printf(" %d ",adr[i] = rand() % 100); putchar('\n'); }

/* Programa que relee una tabla de NB nmeros en memoria compartida */ #include #include #include #include <stdio.h> <sys/types.h> <sys/ipc.h> <sys/shm.h>

#define NB 64 #define CLAVE(key_t) 1000 int *shmat(); main() { int shmid; // la identificacin del segmento int *adr; // Conexin a una direccin no fijada int i; if((shmid = shmget(CLAVE, NB*sizeof(int), IPC_CREAT | 0666)) == -1) { perror("shmget "); exit(2); } // Conexin a una direccin no fijada if((adr = shmat(shmid, 0, SHM_RDONLY)) == (int *) -1) { perror("shmat "); exit(2); }

for(i=0;i<NB;i++) printf(" %d ", adr[i]); putchar('\n'); }

#include #include #include #include #include

<stdio.h> <fcntl.h> <sys/types.h> <sys/mman.h> <unistd.h>

main(argc, argv) int argc; char *argv[]; { int d1, d2; char c, *p; if ((d1 = open(argv[1], O_RDWR, 0)) == -1) { perror("open 1"); exit(2); } if ((d2 = open(argv[1], O_RDWR, 0)) == -1) { perror("open 2"); exit(2); } p = mmap(0, 2048, PROT_READ | PROT_WRITE, MAP_SHARED, d1, 0); if(p == (char *)-1) { perror("mmap"); exit(2); } printf("dcimo carcter: %c\n", p[9]); p[9]++; lseek(d2, 9L, 0); read(d2, &c, 1); printf("dcimo carcter: %c\n", c); }

/* Programa 4.4 (POSIX) Cuenta el nmero de apariciones de un carcter en un archivo */ #include #include #include #include #include #include <sys/types.h> <sys/stat.h> <sys/mman.h> <fcntl.h> <stdio.h> <unistd.h>

int main(int argc, char **argv) { int i, fd, contador=0; char caracter; char *org, *p; struct stat bstat; if (argc!=3) { fprintf (stderr, "Uso: %s caracter archivo\n", argv[0]); return(1); } /* Por simplicidad, se supone que el carcter a contar corresponde con el primero del primer argumento */ caracter=argv[1][0]; /* Abre el archivo para lectura */ if ((fd=open(argv[2], O_RDONLY))<0) { perror("No puede abrirse el archivo"); return(1); } /* Averigua la longitud del archivo */ if (fstat(fd, &bstat)<0) { perror("Error en fstat del archivo"); close(fd); return(1); } /* Se proyecta el archivo */ if ((org=mmap((caddr_t) 0, bstat.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) { perror("Error en la proyeccion del archivo"); close(fd); return(1); } /* Se cierra el archivo */ close(fd); /* Bucle de acceso */ p=org; for (i=0; i<bstat.st_size; i++) if (*p++==caracter) contador++; /* Se elimina la proyeccion */ munmap(org, bstat.st_size); printf("%d\n", contador); return(0); }

/* Programa 4.5 (POSIX) Copia un archivo */ #include #include #include #include #include #include <sys/types.h> <sys/stat.h> <sys/mman.h> <fcntl.h> <stdio.h> <unistd.h>

void main(int argc, char **argv) { int i, fdo, fdd; char *org, *dst, *p, *q; struct stat bstat; if (argc!=3) { fprintf (stderr, "Uso: %s orig dest\n", argv[0]); exit(1); } /* Abre el archivo origen para lectura */ if ((fdo=open(argv[1], O_RDONLY))<0) { perror("No puede abrirse el archivo origen"); exit(1); } /* Crea el archivo destino */ if ((fdd=open(argv[2], O_CREAT|O_TRUNC|O_RDWR, 0640))<0) { perror("No puede crearse el archivo destino"); close(fdo); exit(1); } /* Averigua la longitud del archivo origen */ if (fstat(fdo, &bstat)<0) { perror("Error en fstat del archivo origen"); close(fdo); close(fdd); unlink (argv[2]); exit(1); } /* Establece que la longitud del archivo destino es igual a la del origen.*/ if (ftruncate(fdd, bstat.st_size)<0) { perror("Error en ftruncate del archivo destino"); close(fdo); close(fdd);

unlink (argv[2]); exit(1); } /* Se proyecta el archivo origen */ if ((org=mmap((caddr_t) 0, bstat.st_size, PROT_READ, MAP_SHARED, fdo, 0)) == MAP_FAILED) { perror("Error en la proyeccion del archivo origen"); close(fdo); close(fdd); unlink (argv[2]); exit(1); } /* Se proyecta el archivo destino */ if ((dst=mmap((caddr_t) 0, bstat.st_size, PROT_WRITE, MAP_SHARED, fdd, 0)) == MAP_FAILED) { perror("Error en la proyeccion del archivo destino"); close(fdo); close(fdd); unlink (argv[2]); exit(1); } /* Se cierran los archivos */ close(fdo); close(fdd); /* Bucle de copia */ p=org; q=dst; for (i=0; i<bstat.st_size; i++) *q++= *p++; /* Se eliminan las proyecciones */ munmap(org, bstat.st_size); munmap(dst, bstat.st_size); }

También podría gustarte