Exemple #1
0
int main() {
	char buf[1000];
	char ans[1000];
	fgets(buf, 1000, stdin);
	procesar(ans, buf, strlen(buf)-1);
	printf("%s\n",ans);
}
int main(int argc, char *argv[]) {
	signal(SIGUSR1, (void*) manejarSenial);
	logger = log_create("/home/utnso/personaje.log", "PERSONAJE", true, LOG_LEVEL_TRACE);
	log_info(logger, "Log creado con exito, se procede a loguear el proceso Personaje");

	log_debug(logger, "Chequeando el path del personaje...");
	if (argv[1] == NULL ) {
		log_error(logger, "El path del personaje no puede ser vacio.");
		log_destroy(logger);
		return EXIT_FAILURE;
	}

	path = argv[1];

	int levantarConfig = levantarPersonaje(path);
	if (levantarConfig == 1) {
		return EXIT_FAILURE;
	}

	enviarSeniales();

	int resultado = procesar();
	if (resultado == 1) {
		return EXIT_FAILURE;
	}

	finalizar();
	return EXIT_SUCCESS;
}
Exemple #3
0
void Escena::slot_actualizarEscena()
{
    // Por cada timeout de timerEscena, genera una textura de camara nueva

    videoCapture->operator >>( texturas[0].matTextura );

    procesar( texturas[0].matTextura );

    texturas[0].generarDesdeMat();

    this->repaint();
}
Exemple #4
0
//funcion para procesar la exploracion de un archivo o directorio
contador * procesar(char *arch, int *f, int offset){
		struct stat buf;
		char tmp[500];
		stat(arch,&buf);

		contador *res = (contador *)malloc(sizeof (contador));
		inic_c(res);
		contador *temp;

		//si es un archivo escribo su tamanio en el pipe
		if(!(buf.st_mode & S_IFDIR)){

			sprintf(tmp,"%lld %s\n",(long long)buf.st_size,arch);
			write(*(f+offset+3),tmp,strlen(tmp));
			res->peso=(long long)buf.st_size;
			res->archivos=1;
		}
		else{
			//si es un directorio exploro recursivamente
			DIR *directorio;
			struct dirent *ent;
			directorio=opendir(arch);

			while(ent=readdir(directorio)){
				if(!strcmp(".",ent->d_name) || !strcmp("..",ent->d_name)) continue;

				strcpy(tmp,arch);
				strcat(tmp,"/");
				strcat(tmp,ent->d_name);
				//exploro recursivamente
				temp=procesar(tmp,f,offset);
				res->peso+=temp->peso;
				res->archivos+=temp->archivos;
				res->directorios+=temp->directorios;
				free(temp);
			}

			//este es un directorio asi que sumo 1 
			(res->directorios)++;
			strcpy(tmp,arch);	
			sprintf(tmp,"%lld %s\n",res->peso,arch);
			write(*(f+offset+3),tmp,strlen(tmp));
			closedir(directorio);

		}
		return res;
}
Exemple #5
0
int main(int cantArg, char *arg[]) {
    system("clear");
    if(cantArg>1) {
        if(!(archivo=fopen(arg[1],"rt"))) {
            printf("No existe archivo especificado!\n\n");
        }
        else
            printf("INICIO DE ANALISIS LEXICO!\n\n");
        analisis_lexico(archivo);
        printf("FIN DE ANALISIS LEXICO!\n\n");
        printf(SEPARADOR);
        printf("\nRESULTADOS\n\n");
        archivo=fopen(arg[1],"rt");
        procesar();
        printf("\nFIN DE RESULTADOS\n\n");

    }
    else
        printf("No se especifico archivo fuente!\n\n");
    return 0;
}
Exemple #6
0
void maestro(char *d){

	tam = 0LL;
	cnt_arch=0;
	cnt_dir=0;
	cnt_proc=0;

	int fds[6*MAX_PROC]; //aqui iran todos los descriptores de los posibles 
						 //hijos, en las posiciones pares iran los de lectura
						 //y en los pares iran los de escritura

	int procs =0; //Contador de cuantos hijos se han creado hasta ahora


	//inicializacion del mutex
	pthread_mutex_init(&mutex,NULL);
	int chr;
	DIR *directorio;
	struct dirent *ent;
	char path[TAM2];
	char path2[TAM2];

	//en el path copio a el directorio a explorar
	strcpy(path,d);
	int sz = strlen(d);
	if(path[sz-1]!='/')
		path[sz]='/',path[sz+1]='\0';
	signal(SIGCHLD,childHandler);
	strcpy(path2,path);

	directorio = opendir(dir);

	//busco en todas las entradas del directorio que me mandaron a explorar
	while(ent=readdir(directorio)){
		//si es el mismo, o el papa, continuo
		if(!strcmp(ent->d_name,".") || !strcmp(ent->d_name,"..")) continue;


		struct stat buf;
		strcat(path2,ent->d_name);
		stat(path2,&buf);

		//veo si es un archivo, en ese caso imprimo de una vez su tamanio
		if(!(buf.st_mode & S_IFDIR)){
			fprintf(ptr,"%lld %s\n",(long long)buf.st_size,path2);
			tam+=(long long)buf.st_size;
			cnt_arch++;
		}
		//sino, entonces es un directorio y tengo que hacer un fork
		//para que un hijo se encargue de calcular su tamanio
		else{

			//mientras la cantidad de procesos concurrentes sea mayor o igual
			//a la dada, espero
			//cnt se decrementara cuando un hijo mande una senial SIGCHLD
			//que la utilice para indicar que iba a terminar
			while(cnt>=I);

			//creo el hilo de sincronizacion para el incremento del contador de procesos
			//concurrentes

			//creo dos pipes, uno para que el papa lea y otro
			//para que el papa escriba y viceversa para el hijo
			pthread_create( &hilo, NULL, inc,NULL);
			pthread_join(hilo,NULL);
			pipe(fds+procs);
			pipe(fds+procs+2);
			pipe(fds+procs+4);

			//se crea un nuevo proceso
			cnt_proc++;
	
			

			//creo el hijo
			if(!fork()){
				//este hijo no escribira por el pipe procs+1
				close(*(fds+procs+1));
				//ni tampoco leera por el pipe procs+2
				close(*(fds+procs+2));

				close(fds[procs+4]);
				contador *temp;
				char tmp[300];

				//el hijo verifica que directorio debe explorar, cosa que le comunica el papa
				read(*(fds+procs),tmp,300);

				//proceso el directorio o archivo, segun sea el caso
				//la funcion procesar se encargara
				temp=procesar(tmp,fds,procs);
				sprintf(tmp,"%lld %d %d",temp->peso,temp->archivos,temp->directorios);
				write(fds[procs+5],tmp,strlen(tmp));

				kill(getppid(),SIGCHLD);

				//cierro pipes utilizados por el hijo
				close(fds[procs]);
				close(fds[procs+3]);
				close(fds[procs+5]);
				exit(0);
			}
			else{
				//el papa no leera por el pipe numero procs
				close(*(fds+procs));

				//ni escribira por el pipe procs+3
				close(*(fds+procs+3));

				close(fds[procs+5]);
				write(*(fds+procs+1),path2,strlen(path2));
				procs+=6;
			}
		}
		strcpy(path2,path);
	}
	
	int t;
	//espero a que terminen mis procesos
	for(int i=0;i<I;i++) wait(&t);
	
	for(int i=0;i<procs;i+=6){
	
		read(fds[i+2],buffer,TAM3);	
		fprintf(ptr,"%s",buffer);

		//temporales para leer la cantidad total que mi hijo leyo de archivos, dirs, etc
		int temp1;
		int temp2;
		long long temp3;

		read(fds[i+4],buffer,TAM3);
		sscanf(buffer,"%lld %d %d",&temp3,&temp1,&temp2);
		cnt_arch+=temp1;
		cnt_dir+=temp2;
		tam+=temp3;
		
		//cierro los pipes del maestro que aun siguen abiertos
		close(fds[i+1]);
		close(fds[i+2]);
		close(fds[i+4]);
	}
	fprintf(ptr,"%lld %s\n",tam,d);
	fprintf(stdout,"Numero de archivos encontrados: %d\n",cnt_arch);
	fprintf(stdout,"Numero de directorios explorados (incluyendo el principal): %d\n",cnt_dir+1);
	fprintf(stdout,"Numero total de procesos creados (conteo total, no concurrente): %d\n",cnt_proc+1);

	closedir(directorio);
	fclose(ptr);
}
int perderVida(bool porDeadlock) {
	if (sacarVida(personaje) > 0) {
		if (porDeadlock) {
			log_debug(logger, "El personaje %s perdio una vida, ahora le quedan (%d), causa:DEADLOCK", personaje->nombre, personaje->vidas);
		} else {
			log_debug(logger, "El personaje %s perdio una vida, ahora le quedan (%d) causa:SIGTERM", personaje->nombre, personaje->vidas);
		}

		if (!porDeadlock) {
			log_debug(logger, "Notificando muerte al planificador. Personaje:%s", personaje->nombre);
			notificarMuerte(socketPlanificador);
			esperarConfirmacionDelPlanificador(socketPlanificador);
			log_debug(logger, "Notifico la liberacion de recursos. Personaje:%s", personaje->nombre);
			liberarRecursos(socketNivel);
		} else if (porDeadlock) {
			MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
			mensajeAEnviar->PayloadDescriptor = MUERTE_POR_DEADLOCK;
			mensajeAEnviar->PayLoadLength = sizeof(char);
			mensajeAEnviar->Payload = personaje->simbolo;
			log_debug(logger, "Notifico muerte por deadlock al nivel. Personaje:%s", personaje->nombre);
			enviarMensaje(socketNivel, mensajeAEnviar);
			free(mensajeAEnviar);
		}
		MPS_MSG* mensajeARecibir = malloc(sizeof(MPS_MSG));
		recibirMensaje(socketNivel, mensajeARecibir);
		if (mensajeARecibir->PayloadDescriptor != MUERTE_CORRECTA) {
			return EXIT_FAILURE;
		}
		free(mensajeARecibir);
		close(socketPlanificador);
		close(socketNivel);
		int resultado = procesar();
		if (resultado == 1) {
			return EXIT_FAILURE;
		}
		finalizar();
	} else {
		if (porDeadlock) {
			log_debug(logger, "El personaje %s se quedo sin vidas, causa:DEADLOCK", personaje->nombre, personaje->vidas);
		} else {
			log_debug(logger, "El personaje %s se quedo sin vidas, causa:SIGTERM", personaje->nombre, personaje->vidas);
		}
		if (!porDeadlock) {
			log_debug(logger, "Notificando muerte al planificador. Personaje:%s", personaje->nombre);
			notificarMuerte(socketPlanificador);
			esperarConfirmacionDelPlanificador(socketPlanificador);
			log_debug(logger, "Notifico la liberacion de recursos. Personaje:%s", personaje->nombre);
			liberarRecursos(socketNivel);
		} else if (porDeadlock) {
			MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
			mensajeAEnviar->PayloadDescriptor = MUERTE_POR_DEADLOCK;
			mensajeAEnviar->PayLoadLength = sizeof(char);
			mensajeAEnviar->Payload = personaje->simbolo;
			log_debug(logger, "Notifico muerte por deadlock al nivel. Personaje:%s", personaje->nombre);
			enviarMensaje(socketNivel, mensajeAEnviar);
			free(mensajeAEnviar);
		}
		MPS_MSG* mensajeARecibir = malloc(sizeof(MPS_MSG));
		recibirMensaje(socketNivel, mensajeARecibir);
		if (mensajeARecibir->PayloadDescriptor != MUERTE_CORRECTA) {
			return EXIT_FAILURE;
		}
		free(mensajeARecibir);
		close(socketPlanificador);
		close(socketNivel);
		int levantarConfig = levantarPersonaje(path);
		if (levantarConfig == 1) {
			return EXIT_FAILURE;
		}
		int resultado = procesar();
		if (resultado == 1) {
			return EXIT_FAILURE;
		}
		finalizar();
	}
	return EXIT_SUCCESS;
}