Hola gente,estoy haciendo un tp para la facu el cual requiere emular el comportamiento de un sistema operativo. En mi caso me toco el swapeo del sistema, memoria virtual.
Lo que se me pide es crear un archivo de configuracion el cual inicialmente deberá ser rellenado con el caracter \0, a fines de inicializar la partición de swap. El tamaño de las páginas escritas en swap es configurable, así como también el nombre de este archivo.
Se nos recomienda hacer uso del comando dd de linux para la creacion del archivo
Bien. googleando bastante encontre lo siguiente:
system(" dd if=/dev/zero of=rutaDelArchivo bs=2M count=4")
if: inicializa en cero el archivo
of: pasa la ruta del archivo
bs: tamaño de paginas
count: cantidad de paginas
el problema es que ahi yo estoy harcodeando los valores y lo que yo deberia hacer es que fuera configurable. A su vez ya nos dan un archivo de configuracion con lo siguiente:
PUERTO_ESCUCHA 6000
NOMBRE_SWAP swap.data
CANTIDAD_PAGINAS 512
TAMANIO_PAGINA 25613
RETARDO_COMPACTACION 60000
Osea, lo que yo tendria que hacer es una funcion que reciba el comando dd y que el mismo comando pueda recibir los respectivos NOMBRE_SWAP, CANTIDAD_PAGINAS Y TAMANIO_PAGINA del archivo de configuracion y crear asi el archivo de swap vacio que estoy necesitando.
Espero que no haya sido tan largo y me puedan tirar una mano, gracias!!!
A ver, se ve interezante :)
¿Necesitas que programa en C genere el archivo de configuracion ?
¿ Necesitas que el archivo en C lea la configuracion y posterioremnte mande a llamar a dd con los parametros necesarios para crear la swap ?
Algo de codigo:
FILE *conf;
char *NOMBRE_SWAP = "Nombre";
char *dd = calloc(1000,1);
char *config = calloc(1000,1);
int count_page = 512;
int size_page = 25613;
snprintf(config,1000,"PUERTO_ESCUCHA\t6000\nNOMBRE_SWAP\t%s\nCANTIDAD_PAGINAS\t%i\nTAMANIO_PAGINA\t%i\nRETARDO_COMPACTACION\t60000",NOMBRE_SWAP,count_page,size_page);
snprintf(dd,1000,"dd if=/dev/zero of=%s bs=%i count=%i",NOMBRE_SWAP,count_page,size_page);
exec(dd);
conf = fopen("Test","w");
fprintf(conf,"%s",config);
Saludos!
Claro pero yo tengo un archivoConfigSwap.cfg en algun lado que tiene esto:
PUERTO_ESCUCHA= 6000
NOMBRE_SWAP= swap.data
CANTIDAD_PAGINAS= 512
TAMANIO_PAGINA=25613
RETARDO_COMPACTACION=60000
y yo en alguna funcion mia, ponele "crearParticionSwap" recibo el comando dd y dicho comando recibe para of NOMBRE_SWAP, para bs TAMANIO_PAGINA y para count CANTIDAD_PAGINA y con eso crea la particion vacia de dicho tamaño y dicho nombre
osea recibe lo que tiene cada una de esas variables del archivo .cfg lo que no entiendo es como invocarlas siendo un archivo aparte y como el comando dd lo recibe... ademas en algun lado tengo que colocar la ruta del archivo .cfg de donde voy a sacar lo anterior y no se como.
Igual tu codigo esta bien, pero no es justamente asi. Me estoy quemando el coco jaja
Gracias por la ayuda!
Solucion fscanf
Codigo:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
FILE *conf = NULL;
char *config_file = "config.txt";
char *nombre_swap = calloc(50,1);
char *dd = calloc(1000,1);
int count_page = 0;
int size_page = 0;
conf = fopen(config_file,"r");
if(conf) {
fgets(dd,1000,conf); //Saltamos la primer linea
fscanf(conf,"NOMBRE_SWAP=%s\n\r",nombre_swap);
fscanf(conf,"CANTIDAD_PAGINAS=%d\n\r",&count_page);
fscanf(conf,"TAMANIO_PAGINA=%d\n\r",&size_page);
memset(dd,0,1000);
snprintf(dd,1000,"dd if=/dev/zero of=%s bs=%i count=%i",nombre_swap,count_page,size_page);
printf("dd command: %s\n",dd);
//exec(dd); //Ejecutar dd
}
else {
printf("no se puede abrir el archivo de configuracion\n");
}
}
Salida:
C:\Users\alberto\Desktop>cfg.exe
dd command: dd if=/dev/zero of=swap.data bs=512 count=25613
Solo le tienes que poner el nombre de tu archivo de configuracion y descomentar la linea del exec
Saludos!
Muchas gracias!!