Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Pitagoras

#1
Programación C/C++ / No se como empezar!!
27 Diciembre 2021, 14:49 PM
Buenas tardes tengo un PROBLEMA!! y es que no sé como empezar el codigo del siguiente enunciado:
Crear en C un programa Padre que cree tantos procesos hijos como argumentos
restantes tenga en la linea de ordenes el proceso padre.

saludos
#2
Buenas, necesito ayuda URGENTE!! en un ejercicio, y es que siempre me da Violacion de segmento y ya no se que mas hacer. Si alguien me pudiese ayudar se lo agradeceria de todo corazón.


#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#define NORMAL  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"
#define RED  "\x1b[32m"

/* Función que procesa la lectura un archivo */
void procesoArchivo(char *archivo);

void mostrarContenido(char * path);

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

int opcion=0;
char *path; //Es para la ruta
char *type;
char *name;
int size;
int maxdepth;
int niveles;
unsigned num;

// Con ello evitamos fallos de violacion de segmentacion. Se le asigna un espacio en memoria.
type = malloc(1024);
path = malloc(1024);
name = malloc(1024);

for(int i; i<argc; i++){
if(strcmp(argv[i], "-maxdepth") == 0){ //Si la cadena que tengo en la posicion i es igual a " "
//Devolverá 0 en caso de ser iguales caracter a caracter
if( i == argc){ //Si contador es igual al ultimo numero de parametros muestra error
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=1;

} else if(strcmp(argv[i], "-type") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=2;

} else if(strcmp(argv[i], "-name") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=3;

} else if(strcmp(argv[i], "-size") == 0){
if( i == argc){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
opcion=4;
}else{
switch(opcion){
case 0: //Ruta
if(i != 1){  ///DUDA si va i o argv[i]
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
path=argv[i];
break;

case 1: //Maxdepth
maxdepth <- atoi(argv[i]); //Convierte una cadena a un entero
niveles = maxdepth;

if(! niveles){ //Si niveles es vacio if(niveles != NULL)
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(niveles < 0){ //Si niveles es menor que 0
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}

break;

case 2: //type
//Si la cadena que haya en la posicion i es distinta a la mencionada da un error
if(strcmp(argv[i], "d") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
if(strcmp(argv[i], "f") != 0){
fprintf(stderr, "Error. Modo de empleo: mifind [camino] [opciones]\n");
exit(EXIT_FAILURE);
}
//opcion = 3;
type=argv[i];
break;

case 3: //name


name=argv[i];
break;

case 4: //size


break;
}
}


}

/* Con un puntero a DIR abriremos el directorio */
//Cuando solo tengo la ruta
DIR *dir;

if (argv[1] != NULL){

dir = opendir (argv[1]);

if (dir == NULL){
printf("\nDirectorio ""%s"" No valido!\n\n",argv[1] );
closedir (dir);
return 0;
}

else {
dir = opendir (argv[1]);
path = argv[1];
}
}
else {

dir = opendir (".");
}
/* en *ent almacena información sobre el archivo que se esta "obteniendo" a cada momento */
struct dirent *ent;


/* Leyendo uno a uno todos los archivos que hay */
while ((ent = readdir (dir)) != NULL)
{
/* Nos devolvera el directorio actual (.) y el anterior (..) */
if ( (strcmp(ent->d_name, ".")!=0 ) && (strcmp(ent->d_name, "..")!=0 ))
{
/* Una vez tenemos el archivo, lo pasamos a una funcion para procesarlo. */
procesoArchivo(ent->d_name);
}
}
closedir (dir);

return EXIT_SUCCESS;

//mostrarFiltrado(path, name, type, size, maxdepth);
mostrarFiltrado(path);
}


void procesoArchivo(char *archivo)
{
/* Para "procesar", o al menos, hacer algo con el archivo, vamos a decir su tamaño en bytes */
/* */
FILE *fich;
long ftam;

fich=fopen(archivo, "r");
if (fich)
{
fseek(fich, 0L, SEEK_END);
ftam=ftell(fich);
fclose(fich);
/* Si todo va bien, decimos el tamaño */
printf ("%30s (%ld bytes)\n", archivo, ftam);
}
else
/* Si ha pasado algo, solo decimos el nombre */
printf ("%30s\n", archivo);
}

//void mostrarFiltrado(char *path, char *name, char *type, int size, int maxdepth){
//}

/* Mostrar Contenido Recursivo */
void mostrarFiltrado(char * path)
{
DIR * d = opendir(path);
if(d==NULL) return;
struct dirent * dir;
while ((dir = readdir(d)) != NULL)
{
if(dir-> d_type != DT_DIR)
printf("%s%s\n",BLUE, dir->d_name);
else
if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 )
{
printf("%s%s\n",GREEN, dir->d_name);
char d_path[255];
sprintf(d_path, "%s/%s", path, dir->d_name);
mostrarFiltrado(d_path);
}
//if(strcmp(argv[2], "-type") == 0){
// Funcion_type(dir, type);
//}
}
closedir(d);
}



MOD: Corregidas etiquetas de Código GeSHi