elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 22:28  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  ¿Mejorar este código en C baja Ubuntu?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Mejorar este código en C baja Ubuntu?  (Leído 731 veces)
bertamax

Desconectado Desconectado

Mensajes: 30


Ver Perfil
¿Mejorar este código en C baja Ubuntu?
« en: 7 Agosto 2010, 16:28 »

#include <stdio.h>

#include <string.h>

#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include <limits.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <dirent.h>

#define MAX_THREAD 1

#define BUFSIZE 4096

typedef struct {

   char* filein;

   char* palabra;

       pthread_mutex_t * wcs;

   char* myset;

   sem_t semaforo;

 }param;

void myRun(param lpParam);

void lock(pthread_mutex_t * cs);

void unlock(pthread_mutex_t * cs);

int elabora(sem_t semaforo, char* myset, char* fileOut);

int busquedaPalabra(char* path, char* palabra, sem_t sem, char* myset, pthread_mutex_t * wcs, sem_t semaforo);

void produceFileOut(char* fileOut, char* myset);

char *getPath(const char* filename);

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

   char* path = argv[1];

   char* palabra = argv[2];

   char* fileOut = argv[3];

   char* myset = " ";

   pthread_mutex_t * wcs;

   sem_t semaforo;

   pthread_mutex_init(&wcs,NULL);
   sem_init(&semaforo, MAX_THREAD, NULL);

   elabora(semaforo, myset, fileOut);

   sem_post(&semaforo);

   pthread_mutex_destroy(&wcs);

   return 0;

}

void lock(pthread_mutex_t * cs){

   pthread_mutex_lock(&cs);

}

void unlock(pthread_mutex_t * cs){

   pthread_mutex_unlock(&cs);

}

int elabora(sem_t semaforo, char* myset, char* fileOut) {

    int i;

   for(i=0; i < MAX_THREAD; i++ )
      wait(&semaforo);

   if(strlen(myset)==0)

           printf("La cadena a buscar no se encuentra en el directorio especificado \n");

   else

      produceFileOut(fileOut, myset);

   return 0;

}

int busquedaPalabra(char* path, char* palabra, sem_t sem, char* myset, pthread_mutex_t * wcs, sem_t semaforo) {

    pthread_t hthread;

    char *puntero;

    char* dirname=getPath(path);
    DIR *file1;

    struct stat statbuf;
    struct dirent *direntp;

    int fd=NULL;

    strcat(dirname,"\\*");

    direntp = readdir(file1);

    if(fd==NULL )

   return -1;
    stat(file1, &statbuf);

    while(readdir(file1)!=0) {

   if(statbuf.st_mode & S_IFDIR) {
      if((strcmp(direntp->d_name,".") != 0) && (strcmp(direntp->d_name,"..") != 0)) {

         char* subdir=dirname;

                   //size_t its=strlen(subdir);

                   //its--;

                   //puntero=(char *)malloc(its);

                   strcpy(puntero, subdir);

                   strcat(puntero, file1->cFileName);

         busquedaPalabra(puntero,palabra,sem,myset,wcs,semaforo);

                   free(puntero);

      }
   }

   else {

      char* nameF=dirname;

                size_t its=strlen(nameF);

               its--;

               puntero=(char*)malloc(its);

               strcpy(puntero, nameF);

               strcat(puntero, file1->cFileName);

      wait(&semaforo);

                param->filein=puntero;

               param->palabra=palabra;

               param->myset=myset;

               param->wcs=wcs;

               param->semaforo=&semaforo;
      pthread_create(hthread, NULL, myRun, (param)(param));

      pthread_kill(hthread);
   }   
    }

    closedir(fd);

    return 0;

}

void produceFileOut(char* fileOut, char* myset) {

   FILE *fout;

   fout = fopen (fileOut, "wt");

   fwrite(myset, strlen(myset)+1, 1, fout);

   fclose(fout);

}

char *getPath(const char* filename) {
    getcwd(filename,BUFSIZE);

}

void myRun(param lpParam) {

    param *pa=&lpParam;

    char* s;

    FILE *fin;

    char* ret;

    fin = fopen(pa->filein, "wt");
    s=strlen(pa->filein);

    while(getline(pa->palabra, s, fin)) {

       lock(&pa->wcs);

        ret=strcat(pa->myset, pa->filein);

          break;

    }

    unlock(&pa->wcs);

    fclose(fin);

    sem_destroy(&(pa->semaforo));

}

Gracias


En línea
Debci
Wiki

Desconectado Desconectado

Mensajes: 1.945


Actualizate o muere!


Ver Perfil WWW
Re: ¿Mejorar este código en C baja Ubuntu?
« Respuesta #1 en: 8 Agosto 2010, 10:35 »

1-Si no dices lo que hace la gente del foro no son la bruja lola  :xD
2-Tags de code... es muy largo y no se puede analizar bien...  :¬¬
3-Completa con alguna explicacion, hay muchas posibles mejoras para hacerle a un codigo xD


Saludos


En línea

bertamax

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: ¿Mejorar este código en C baja Ubuntu?
« Respuesta #2 en: 8 Agosto 2010, 14:43 »

Es verdad, explico el código:
Programa en C que implementa el comando GNU/Linux fgrep, utilizado para buscar una cadena de texto dentro de un fichero, sin considerar las expresiones regulares. Utiliza mecanismos multihilo. El límite máximo de hilos presentes en cada instante en el interior de un proceso es 20. Los ficheros deben repartirse la búsqueda en el fichero, de forma que cada hilo busque en un trozo del fichero de no más de 1000 bytes. Mecanismos para que ninguna parte quede sin analizar, y ninguna sea analizada dos o más veces.
La aplicación debe buscar en el interior de los ficheros de la carpeta de origen (pasada como parámetro) y de la subcarpeta, una cadena de texto pasada como parámetro. Si la cadena está presente en el interior de uno o más ficheros, el programa deberá generar un fichero de salida, ordenado alfabéticamente, que contenga los nombres de los ficheros con la ruta absoluta (que contenga la cadena), una por línea, por ejemplo:
C:\temp\file1.txt
C:\temp\subfolder1\file2.text
C:\temp\subfolder2\file3.text
La cadena a buscar podrá contener espacios, caracteres de puntuación, caracteres mayusculas y minusculas que tendrán que ser consideradas diferentes.
La aplicación recibe como parámetros en línea de comandos:
La carpeta origen donde buscar la cadena
La cadena a buscar
El fichero de salida
En el siguiente formato:
fgrep "carpeta origen" "cadena a buscar" fich_salida
Muchas gracias
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Boutique plus en Ubuntu ingresar codigo manualmente
Ingeniería Inversa
dogocat 1 752 Último mensaje 27 Enero 2012, 21:16
por MCKSys Argentina
Ayuda a mejorar código. C sobre Linux.
Programación C/C++
NeoB 2 248 Último mensaje 16 Febrero 2012, 15:59
por NeoB
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines