Colonia de Bacterias

Abel Naya

/* Recreación de una colonia de bacterias: 1 fichero (bacteria) genera 2 ficheros (bacterias) hijos, cada uno de estos genera otros 2, y así sucesivamente, etc. ¡¡Ciudado con su ejecución descontrolada!!, el usuario asume las consecuencias de su acción. */

/*
Colonia de Bacterias:
Programa sencillo que crea dos copias exactas de si mismo (en realidad solo una) manteniendo el nombre de archivo y su extensión, pero uno añadiendo r y otro añadiendo l.
Además cada uno de estos programas se vuelve a dividir (hasta un límite prefijado)

Nota del autor:
Lo normal en este tipo de programas 'malware' es que el ejecutable sea el que crea todos los 'hijos' mediante un bucle. Pero esa no es la manera de dividirse de las bacterias. Es por esto que he querido simular lo máximo posible la división unicelular: una bacteria se divide en dos copias idénticas, cada una de ellas se vuelve a dividir por si sola.
Además, gracias al Shellejecute de la libreria windows, se puede ejecutar la hija como proceso independiente por lo que el programa resulta más peligroso ya que hay tantos procesos simultáneos como archivos.
*/

#include <stdio.h>//para los files y printf
#include <string.h> //para las cadenas
#include <windows.h>//para el shellejecute

//¡¡Cuidado con este número!!
#define defdup 3 //numero de veces que se repetirá la duplicación. Archivos finales: pow(2,defdup)
//¡¡Cuidado con este número!!



int main(int argc,char*argv[])
{

int dup = (argc==2)? argv[1][0]-'0' : defdup;


//system("pause");//parada de control


//archivos
FILE *madre,*hija;

//longitud cadena
int longitud=strlen(argv[0]);

//directorios
char dmadre[longitud+2],dhija[longitud+2];

//copia el directorio
strcpy(dmadre,argv[0]);

//modifica el directorio añadiendo 'r' y 'l' a los dos archivos (de Right y Left) despues del nombre pero antes de la extensión (lo que va tras el último punto)
int i;
for(i=longitud+1;dmadre[i]!='.';i--)
{
  dmadre[i]=dmadre[i-1];
}
  strcpy(dhija,dmadre);
  dmadre[i]='r';
  dhija[i]='l';


//printf("%s\n\n%s\n\n",dmadre,dhija);

//el archivo original se convierte en una hija
rename(argv[0],dmadre);

//se copia el contenido en otro que se crea
madre=fopen(dmadre,"rb");
hija=fopen(dhija,"wb");
char c;
do
{
  c=fgetc(madre);
  printf("%c",c); //Si no quieres que aparezcan caracteres por consola quita está línea
  fputc(c,hija);
}while(!feof(madre));
fclose(madre);
fclose(hija);


//A dividirse toca (pero con límite)
if(dup>1){

//Preparativos
char par1[2] = {(char)(dup-1+'0'),0};
char* parametros[2]={dmadre,par1};
char lista[longitud+2+5];
sprintf(lista,"%c",(char)(dup-1+'0'));
//sprintf(lista,"\"%c\"\0",(char)(dup-1+'0'));

//Le da 'vida' a la hija para que se divida
ShellExecute(NULL,"open",dhija,lista,NULL,SW_SHOWNORMAL);

//La madre se sigue dividiendo
main(2,parametros);

}

return 0;
}



Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

3 respuestas a Colonia de Bacterias

  1. Bonita solución. Podías haber reproducido también las hijas con “main(2,parametros_hija)”. Fíjate detalle de completar cadena en par1[2], y de simplificación de lista. Así también marcha bien la reproducción, desactivando el printf() del copiado de ficheros que si no atasca la cosa con sonidos innecesarios. En resumen, very good!!.

    • Abel Naya

      1-Si usará el main para reproducir la hija no se crearía un proceso independiente (lo explico en la introducción)
      2-Usar strings puede ser confuso 😛 No me había dado cuenta de esos fallos.
      3-Lo del printf lo puse porque ver una pantalla en negro asusta menos que si ves caracteres extraños 🙂 ( a mi no me salen los sonidos) Lo he vuelto a poner con un comentario explicativo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s