|
Mostrar Mensajes
|
Páginas: 1 2 [3]
|
21
|
Programación / Programación C/C++ / ¿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
|
|
|
23
|
Programación / Programación C/C++ / Equivalencia de función WINAPI unsigned int WINAPI myRun en Windows con Ubuntu
|
en: 5 Agosto 2010, 03:45 am
|
Hola, escribí lo mejor que pude el siguiente programa en Windows: #include <stdio.h> #include <string.h> #include <windows.h> #include <process.h> #include <direct.h> #include <stdlib.h> #include <ctype.h> #include <conio.h> #define MAX_THREAD 1 #define BUFSIZE 4096 #define WIN32_LEAN_AND_MEAN typedef struct { char* filein; char* palabra; CRITICAL_SECTION * wcs; char* myset; HANDLE* semaforo; }param; extern unsigned int WINAPI myRun(LPVOID lpParam); void lock(CRITICAL_SECTION * cs); void unlock(CRITICAL_SECTION * cs); int elabora(char* path, char* palabra, HANDLE semaforo, char* myset, char* fileOut); int busquedaPalabra(char* path, char* palabra, HANDLE sem, char* myset, CRITICAL_SECTION * wcs, HANDLE* 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 = " "; CRITICAL_SECTION * wcs; HANDLE semaforo; InitializeCriticalSection(&wcs); semaforo = CreateSemaphore(NULL, MAX_THREAD, MAX_THREAD, NULL); elabora(path, palabra, semaforo, myset, fileOut); CloseHandle(semaforo); DeleteCriticalSection(&wcs); return 0; } void lock(CRITICAL_SECTION * cs){ EnterCriticalSection(&cs); } void unlock(CRITICAL_SECTION * cs){ LeaveCriticalSection(&cs); } int elabora(char* path, char* palabra, HANDLE semaforo, char* myset, char* fileOut) { int i; for(i=0; i < MAX_THREAD; i++ ) WaitForSingleObject(semaforo,INFINITE); 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, HANDLE sem, char* myset, CRITICAL_SECTION * wcs, HANDLE* semaforo) { HANDLE hthread; char *puntero; char* dirname=getPath(path); WIN32_FIND_DATA file1; HANDLE fd=INVALID_HANDLE_VALUE ; fd=FindFirstFile(dirname,&file1); if(fd==INVALID_HANDLE_VALUE ) return -1; while(FindNextFile(fd,&file1)!=0) { if((file1.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0) { if((strcmp(file1. cFileName,".")!=0) && (strcmp(file1. cFileName,"..")!=0)) { char* subdir=dirname; its--; strcat(puntero , file1. cFileName); busquedaPalabra(puntero,palabra,sem,myset,wcs,semaforo); } } else { char* nameF=dirname; its--; strcat(puntero , file1. cFileName); WaitForSingleObject(semaforo,INFINITE); param.filein=puntero; param.palabra=palabra; param.myset=myset; param.wcs=wcs; param.semaforo=&semaforo; hthread= (HANDLE)_beginthreadex(NULL,0,&myRun,(void *)(param),0,NULL ); CloseHandle(hthread); } } FindClose(fd); return 0; } void produceFileOut(char* fileOut, char* myset) { FILE *fout; fout = fopen (fileOut , "wt"); } char *getPath(const char* filename) { DWORD retval = 0; char fullPath[BUFSIZE]=TEXT(""); char valor; LPTSTR lpszFilePart = NULL; retval = GetFullPathName(filename, BUFSIZE, fullPath, &lpszFilePart); valor= fullPath; return valor; } unsigned int WINAPI myRun(LPVOID lpParam) { Param *pa=lpParam; char* pos; char* s; FILE *fin; char* ret; fin = fopen(pa. filein(), "wt"); while(getline(fin,s)) { if (pos!=npos) { lock(*pa.wcs); ret =strcat(pa. myset, pa. filein); break; } } unlock(*pa.wcs); ReleaseSemaphore(*(pa.semaforo),1L,NULL); return 0; }
y como buenamente puedo lo paso a Ubuntu: #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 #define WIN32_LEAN_AND_MEAN typedef struct { char* filein; char* palabra; pthread_mutex_t * wcs; char* myset; sem_t semaforo; }param; extern unsigned int WINAPI myRun(LPVOID lpParam); void lock(pthread_mutex_t * cs); void unlock(pthread_mutex_t * cs); int elabora(char* path, char* palabra, 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); sem_init(&semaforo, MAX_THREAD, NULL); elabora(path, palabra, 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(char* path, char* palabra, sem_t semaforo, char* myset, char* fileOut) { int i; for(i=0; i < MAX_THREAD; i++ ) wait(&semaforo); 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, HANDLE 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; fd=readdir(dirname,&file1); if(fd==NULL ) return -1; direntp = readdir(file1); stat(file1, &statbuf); while(readdir(fd,&file1)!=0) { if(statbuf.st_mode & S_IFDIR) { if((direntp.d_name != 0) && (direntp.d_name != 0)) { char* subdir=dirname; its--; strcat(puntero , file1. cFileName); busquedaPalabra(puntero,palabra,sem,myset,wcs,semaforo); } } else { char* nameF=dirname; its--; 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, (void *)(param))); pthread_kill(hthread); } } closedir(fd); return 0; } void produceFileOut(char* fileOut, char* myset) { FILE *fout; fout = fopen (fileOut , "wt"); } char *getPath(const char* filename) { getcwd(filename,BUFSIZE); } unsigned int WINAPI myRun(LPVOID lpParam) { Param *pa=lpParam; char* pos; char* s; FILE *fin; char* ret; fin = fopen(pa. filein(), "wt"); while(getline(fin,s)) { if (pos!=npos) { lock(*pa.wcs); ret =strcat(pa. myset, pa. filein); break; } } unlock(*pa.wcs); sem_destroy(*(pa.semaforo)); return 0; }
El problema es que no se como sustituir la función WINAPI con alguna que funcione en ubuntu y tenga la misma funcionalidad, o adaptar el programa entero a ubuntu de la mejor manera posible. Por cierto, el lenguaje de programación es C, no C++ Muchas gracias a todos. Lh: Utiliza las etiquetas GeSHi para poner código.
|
|
|
25
|
Programación / Programación C/C++ / Funciones end and erase en C?
|
en: 1 Agosto 2010, 20:18 pm
|
Tengo el siguiente codigo en C++:
. . . string subdir=dirname; string::iterator its=subdir.end(); its--; subdir.erase(its); subdir+=file1.cFileName; . . .
Y me gustaría transformarlo a código C, pero tengo problema con las funciones end y erase porque no existen en C y no sé cuales podrían ser sus equivalentes.
Muchas gracias
|
|
|
28
|
Sistemas Operativos / Windows / Programación en C bajo windows
|
en: 26 Julio 2010, 23:52 pm
|
Necesito hacer unas prácticas de programación de sistemas en C bajo Windows y Linux, el problema es que busco en Google y todo lo que encuentro es en C++.
¿Conoceis algunos tutoriales en C con ejemplos que sea buenos?
Muchas gracias
|
|
|
30
|
Seguridad Informática / Nivel Web / Aplicar seguridad XSS
|
en: 22 Julio 2010, 09:47 am
|
Hola, Esta parte del código en java es vulnerable a XSS: <%String espe=es[1];%> email antiguo: <input type="text" name="espeA" value=<%=espe%>><br> <br>email nuevo: <input type="text" name="espe"><br> <br><input type="submit" value="Modificar"> <%}else{%> <input type="hidden" name="oculto" value="a"> <%}%> <%if(request.getParameter("espe")!=null){ String especialidad=request.getParameter("espe"); int cod=Integer.parseInt(request.getParameter("oculto")); He estado buscando cómo resolverlo por este foro, y he visto que podía añadir es script http://www.json.org/json2.jsp para resolverlo, pero no lo se hacer. O añadir htaccess, pero tampoco lo se. Por otro sitio he visto que se podía resolver con JSTL, y tambien con la librería ESAPI, pero con JSTL no me funciona y con ESAPI no tengo ni idea. Total que despues de documentarme un monton estoy super perdida. Me gustaría que me ayudaran a resolverlo, aunque sea de la manera más sencilla, porque soy principiante
|
|
|
|
|
|
|