elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿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 2,812 veces)
bertamax

Desconectado Desconectado

Mensajes: 40


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

#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: 2.021


Actualizate o muere!


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

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: 40


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

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
Ayuda a mejorar código. C sobre Linux.
Programación C/C++
NeoB 2 2,327 Último mensaje 16 Febrero 2012, 15:59 pm
por NeoB
(SOLUCIONADO) Se puede mejorar este FOR?
.NET (C#, VB.NET, ASP)
Eleкtro 4 2,941 Último mensaje 27 Noviembre 2012, 09:51 am
por Eleкtro
Mejorar codigo estructura y procesos.
Programación C/C++
BKsiragon 4 2,939 Último mensaje 30 Enero 2014, 18:33 pm
por rir3760
Mejorar este código
.NET (C#, VB.NET, ASP)
Meta 1 2,289 Último mensaje 12 Diciembre 2015, 21:56 pm
por kub0x
Se puede mejorar este codigo¿?
Programación C/C++
trioper 4 2,395 Último mensaje 29 Abril 2017, 12:16 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines