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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / como crear multiples procesos en C y tuberias pipe() en: 19 Diciembre 2018, 16:05 pm
hola verán tengo mi codigo que cuenta la cantidad de archivos que hay en un directorio y después devuelve el nombre de ese archivo junto a su md5sum , lo que sucede es que mi tarea dice lo siguiente:

La aplicacion debe examinar una vez cada cierto tiempo el contenido del directorio “/var/log”, para identificar los cambios que hayan ocurrido en los archivos de log del sistema desde la u´ltima revisi´on. Se deben omitir los subdirectorios y los archivos con extension “.gz”. Para verificar los archivos debe utilizar el comando de shell “md5sum” mediante las llamadas al sistema fork y exec. Por cada archivo a ser procesado su aplicaci´on debe crear un subproceso el cual se encargar de ejecutar el comando “md5sum”. El resultado del comando debe ser retornado

entonces encontre un codigo aqui en stackoverflow sobre como crear multiples procesos hijos: https://stackoverflow.com/questions/876605/multiple-child-process , lo cual supongo que es como lo piden en mi enunciado ya que dice "por cada archivo a prcesar se crea un subproceso" pero queria saber si es la manera correcta.

lo segundo es con las tuberias, yo tengo mi funcion piepe() y mi arreglo inf[2] y usando la funcion dup. redirigo la salida y entrada, pero tengo duda si tengo que crear una especie de arreglo dianmico o un arreglo de arreglo , ya que se deben crear N tuberias de acuerdo a mis N archivos leidos

Código
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include <unistd.h>
  7. #include <sys/wait.h>
  8. #include<dirent.h>
  9.  
  10. char buffer[100];
  11.  
  12. int s;
  13.  
  14.  
  15.  
  16. int path_is_dir(char *path) {   //valido si son subdirectorios
  17.    struct stat st_info;
  18.  
  19.    if (stat(path, &st_info) < 0) {
  20.        return 0;
  21.    }
  22.  
  23.    return S_ISDIR(st_info.st_mode);
  24. }
  25.  
  26.  
  27. void validar_folder(){
  28.  
  29. int carp;
  30.  
  31. DIR *dirp_p;
  32. struct dirent *entry;
  33. dirp_p = opendir("/home/jose/Escritorio/carpetaPrueba") ; //va "/var/log/PROYECTO_SO_1"
  34.  
  35.    if(dirp_p == NULL ){
  36.        carp= mkdir("carpetaPrueba",0777);          //creo la carpeta
  37.    }
  38.  
  39. }
  40.  
  41.  
  42. int main(){
  43.  
  44. int cont_file=0;
  45. int inf[2];
  46.  
  47. validar_folder();
  48.  
  49. pipe(inf);
  50.  
  51. DIR *dirp;
  52. struct dirent * entry;
  53. dirp = opendir("/home/jose/Escritorio");
  54.  
  55. while ((entry = readdir(dirp) )!=NULL) { //cuanto la cant de archivos
  56.     if (entry->d_type == DT_REG) {
  57.       cont_file++;
  58.    }
  59. }
  60. closedir(dirp);
  61.  
  62.  
  63. const char * dir_name = "/home/jose/Escritorio";            
  64. DIR * dir_ptr = NULL;
  65. struct dirent * dirent_ptr;        
  66.  
  67. dir_ptr = opendir( dir_name );
  68.  
  69. //int f = open("prueba.txt", O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO);
  70.  
  71. while ( (dirent_ptr = readdir( dir_ptr ) ) != NULL ){
  72.  
  73. if(!path_is_dir(dirent_ptr -> d_name)){
  74.  
  75. if(fork()==0){
  76.  
  77. close(1);
  78.  
  79. dup(inf[1]); // redirige la salida estandar
  80.  
  81. execl("/usr/bin/md5sum", "md5sum", dirent_ptr -> d_name, NULL);
  82.  
  83. }else{
  84.  
  85. read(inf[0], buffer, 100);
  86.  
  87. buffer[32] = '\0';
  88. printf("%s :", dirent_ptr -> d_name);
  89. printf("%s\n", buffer);
  90.  
  91.  
  92. wait(&s);
2  Programación / Programación C/C++ / Re: ayuda , guardar en un regsitro, inconvenientes en: 23 Enero 2018, 12:30 pm
vale gracias MAFUS, en seguida lo pruebo, supongo que cuando dices "todo debe estar del if (caracter!=\n)" hablas de todos los if y else if nada mas cierto?
3  Programación / Programación C/C++ / ayuda , guardar en un regsitro, inconvenientes en: 23 Enero 2018, 02:04 am
Hola a todos, verán tengo un incoveninete, tengo que leer desde un archivo que se llama entrada.in donde me daran varios de diferentes cosas, tiempo de llegada, scanners, impresoras, etc... valores los cuales tengo que guardar en un registro y bueno, use un arreglo de structs para eso, el asunto es que primero leo con fgetc cada numero caracter sin comas ni espacios en blancos,

despues el problema surge que al imprimir esos mismo valores que guardo, ocurre un problema ... creo que me imprime valores negativos entre cada valor y que tambien pareciera que en el ultimo valor, no se tomara un valor, como si no estuviera:

ejemplo del archivo:

1, 0, 1, 0, 0, 0, 0
1, 1, 2, 1, 0, 0, 1
3, 3, 6, 1, 0, 1, 2

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. struct list_entra {                       //registro con 7 campos
  6. int tiempo_llegada;
  7.    int prioridad;
  8.    int procesa;
  9.    int scanner;
  10.    int impresora;
  11.    int modem;
  12.    int dvd;
  13. }proentra [7] ;
  14.  
  15.  
  16. int main (int argc, char *argv[]) {
  17. int contaproceso= 0, i;                   //contador para saber en cual celda del arreglo de struct se guardará
  18. int contcanti =0;                            //contador que uso para ver los diferentes campos del struct
  19. char carac;
  20.  
  21.    FILE *archivo;
  22.    archivo= fopen("listaprocesos.in", "r");
  23.  
  24.    if (archivo == NULL){
  25.        printf ("error al abrir archivo \n");
  26.        exit (1);
  27.    }
  28.  
  29.    while (carac != EOF){                                                            //imprimo para ver si lee bien los caracteres que necesito
  30. carac= fgetc (archivo);
  31.        if (carac != '\n' && carac != ',' && carac != ' '){
  32. printf ("%c\n", carac);
  33.        }
  34.  
  35.        if (contcanti==0){ //lleno el registro y resto -48 para pasar de caracter a entero
  36. proentra [contaproceso].tiempo_llegada= (int)(carac-48);
  37. }else if (contcanti==1){
  38. proentra[contaproceso].prioridad= (int)(carac-48);
  39. }else if (contcanti==2){
  40. proentra[contaproceso].procesa= (int)(carac-48);
  41. }else if (contcanti==3){
  42. proentra[contaproceso].scanner= (int)(carac-48);
  43. }else if (contcanti==4){
  44. proentra[contaproceso].impresora = (int)(carac-48);
  45. }else if (contcanti==5){
  46. proentra[contaproceso].modem= (int)(carac-48);
  47. }else if (contcanti==6){
  48. proentra[contaproceso].dvd= (int)(carac-48);
  49. }
  50. contcanti++;
  51.  
  52. if (contcanti==7){
  53. contcanti=0;
  54. contaproceso++;
  55. }
  56.    }
  57.  
  58.    for (i=0;i<contaproceso;i++){                                      //imprimo por pantalla
  59. printf ("\n%d", proentra[i].tiempo_llegada );
  60. printf ("\n%d", proentra[i].prioridad );
  61. printf ("\n%d", proentra[i].procesa);
  62. printf ("\n%d", proentra[i].scanner);
  63. printf ("\n%d", proentra[i].impresora);
  64. printf ("\n%d", proentra[i].modem);
  65. printf ("\n%d", proentra[i].dvd);
  66. }
  67.  
  68.    fclose (archivo);
  69.  
  70.    return 0;
  71. }
  72.  
  73.  

y me muestra por consola esto:

1
0
1
0
0
0
0
1
1
2
1
0
0
1
3
3
6
1
0
1
2


1
-4
-16
0
-4
-16
1
-4
-16
0
-4
-16
0
-4
-16
0
-4
-16
0
-38
1
-4
-16
1
-4
-16
2
-4
-16
1
-4
-16
0
-4
-16
0
-4
-16
1
-38
3
-4
-16
3
-4
-16
6
-4
-16
1
-4
-16
0
-4
-16
1


podrían ayudarme, es una tarea que me mandaron, soy principiante en programación y he estado observando pero no lo logró ver el problema.
4  Programación / Programación C/C++ / ayuda con mi codigo, leer de un archivo en c en: 28 Mayo 2015, 23:17 pm
hola estoy teniendo problemas econ mi codigo de una tarea. este es el enunciado:

Inicialmente su código debe leer un archivo llamado “reglas.txt”, este contiene en cada
línea alguna letra del abecedario (solo trabajaremos con letras mayúsculas) y al lado
de cada letra estará su respectiva codificación en binario. Serán las letras de la A
hasta la Z y los números de 0 al 4, así tenemos 32 caracteres, 5 bits para cada uno. El
archivo tiene la siguiente estructura:
<Letra> <Binario de 5 bits>Ejemplo reglas.txt:
G 00000
Z 11001
K 00011
.
.
.
.
1 01110
Fíjese que las letras en el archivo no necesariamente están en orden alfabético,
igualmente los números tampoco están en orden. La idea es que las cadenas de
entrada tengan un significado diferente según el archivo de reglas. Todas las letras y
números mencionados anteriormente deben estar incluidos en las reglas con su
respectiva codificación en binario.
Si la entrada fuera 1 00000110010111000000, se tiene que escribir el mensaje
decodificado en un archivo de salida, cada entrada es una línea en la salida. Para el
ejemplo anterior, en el archivo salida se escribe GZ1G. Todo esto con las reglas
definidas antes.

bueno se que se imprime en un archivo salida pero primero imprimo en la terminal para ir probando mi codigo

ahora esta es la parte de opcion 1 la opcion ya la tengo hecha aparte no se preocupen por eso.

la cadena de 50 digitos sera mi bin y como tengo que ir cortando de esa cadena cada 5 digitos creen un for que guardare ese valor que va a ir del 0 al 4 despues cambie los iteradores por que al segundo termino de 5 digitos lo corto de 5 a 9

uso el fscanf para leer del archivo reglas ya que siempre leera un caracter y la cadena, luego uso el strncmp para comparar el arreglo con la cadena del archivo reglas si son iguales devolvera 0 y si es 0 guarda el caracter en el arreglo sol.

ahora el problema qu etengo es que este es mi archivo reglas:

K 00101
J 10111
A 00100
X 10010

y si coloco opcion 1 00101 me imprime k pero tambien me imprime algo de basura y por ejemplo si coloco opcion 1 10111 que seria j , el codigo no hace nada , me pueden ayudar con esto que no se por que el codigo genera estos problemas.

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>  
  3. #include <string.h>
  4.  
  5. int main (int argc, char *argv[]) {
  6. int i=0,j=0,k=0,l=0,m=0,n=0;
  7. char bin[50],str1[5],letra,op,ArrSol[10];
  8.  
  9. int caracter,ret;
  10. int v=0, z=5;
  11. char array[5];
  12. FILE *reglas;
  13.  
  14. scanf("%c %s",&op,bin);
  15.  
  16. if(op=='1'){ //Opción 1
  17. reglas=fopen(argv[1],"r"); //abriendo archivo reglas
  18.  
  19. if(reglas==NULL){
  20. printf("Error en el archivo");
  21. }else{
  22. while (!feof(reglas)){
  23. if((fscanf(reglas,"%c %s",&letra,str1))!=NULL){
  24. //printf("%c %s\n",letra,str1);//Probando que lee línea a línea
  25.  
  26. for (v=0;v<z;v++){
  27. array[v]=bin[v];
  28. l++;
  29. }
  30. v=l;
  31. z=z+5;
  32.  
  33.    ret=strncmp(array,str1,5);
  34. //printf("%d",ret);
  35. if (ret==0){    
  36. ArrSol[k]=letra;
  37. }
  38. k++;
  39. printf ("%s" , ArrSol);
  40. }
  41. }
  42. }  
  43. }
  44. }
  45.  
  46.  
  47. fclose(reglas);
  48.  
  49. return 0;
  50. }
  51.  
5  Programación / Programación C/C++ / BACKTRACKING CIRCUITO HAMILTONIANO en: 23 Mayo 2015, 01:50 am
se trata de que leo 3 valores el primero que es la cantidad de atracciones, el segudno que son las populares (maayor nivel de diversion) y h que son aristas con las que se conectan las atracciones.

primero asi seria la entrada:

6 2 3

noria 12
mon_rusa 20
carritosCHO 100
silla_voladora 15
gusanito 1
casa_terror 13
0 1
2 1
0 2

y la salida es:

CarritosCho Mon_rusa
POSIBLE
Entrada CarritosCho Mon_rusa Entrada
Entrada Mon_rusa CarritosCho Entrada

si es imposible solo devuelve imposible

pero aparte el programa no me compila y no se si el backtracking este bien, por favor podrian ayudarme .

hola podrian ayudarme con este codigo, es un backtracking que me tiene que devolver si es posible o es imposible que haya circuito hamiltoniano

Código
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. class atraccion {
  6. private:
  7. int x;
  8. string name;
  9. public:
  10.  
  11. atraccion () {}
  12. atraccion (int var, string nnombre){
  13. x=var;
  14. name = nnombre;
  15. }
  16. ~atraccion() {}
  17.  
  18. void set_x (int val) { //modifica el x
  19. x = val;
  20. }
  21.  
  22. int get_x () { //devuelve el x
  23. return x;
  24. }
  25.  
  26. void set_name ( string nom) { //modifica el nombre
  27. name =nom;
  28. }
  29.  
  30. string get_name () { //devuelve el nombre
  31. return name;
  32. }
  33. };
  34.  
  35.  
  36. void back (int i, int j, bool array[11][11],int camino[],int acum=0 , int arist){
  37.  
  38. if((j==0) && (acum= arist-1)){
  39. cout<<"POSIBLE"<<endl;
  40. }else{
  41. if (array[i][j] == true ){
  42. for (int x=0;x<11;x++){
  43. int p=j;
  44. camino[x]=j;
  45. array[i][j] = array[j][i]=false;
  46. acum=acum+1;
  47. back (i=p, j=0, array, camino, acum, arist);
  48.  
  49. camino[x] = ' '; //desmarco y deshago mu solucion
  50. acum= acum-1; //desmarco y deshago mi solucion
  51.  
  52. }
  53.  
  54. }else{
  55. back(i,j++,array,camino, acum,arist); //busco otra solucion
  56. }
  57. cout<< "IMPOSIBLE"<<endl;
  58. }
  59. }
  60.  
  61.  
  62. int main (){
  63. int m, n, h,div;
  64. int posmayor,mayor;
  65. bool mat[11][11];
  66. int x,y;
  67. string nombre;
  68. atraccion intercambio;
  69. int r=0,s=0,t=0;
  70.  
  71. cin>>m>>n>>h;
  72.  
  73. int sol[h-1];
  74. atraccion ar [m]; //arreglo que almacena cada atraccion
  75.  
  76. for (int i=0;i<m;i++) {
  77. cin>>nombre;
  78. cin>>div;
  79. ar[i].set_name(nombre);
  80. ar[i].set_x (div);
  81. }
  82.  
  83. for( int g=0;g<11;g++){ //matriz de adyacencia
  84. for (int f=0;f<11;f++){
  85. mat[g][f] =false;
  86. }
  87. }
  88.  
  89.    for (int d=0;d<=h-1;d++){           // Coloco de par en par de vértices conexos hasta que no haya más aristas
  90.            cin >> x >> y;     // Leo la pareja
  91.            mat[x][y]=mat[y][x]=true; // Guardo el dato en la matriz de adyacencia
  92.            }
  93.  
  94. for (int w=0;w<=m-2;w++){               //ordenamiento //modelo 2
  95.            posmayor = w;
  96.            mayor = ar[w].get_x();
  97.            for (int k=w+1; k<=m-1; k++){
  98. /*if ((ar[k].get_x() == mayor) && (ar[k].get_name () < ar[w].get_name())){
  99. mayor= ar[k];
  100. posmayor=k;
  101. }else{*/
  102.                if (ar[k].get_x() > mayor) {
  103.                    mayor = ar[k].get_x();
  104.                    posmayor =k;
  105. }
  106. //}
  107.            }
  108.  
  109.            intercambio = ar[posmayor]; //se encarga de cambiarlos
  110.            ar[posmayor] =ar[w];
  111.            ar[w] = intercambio;
  112. }
  113.  
  114. for (int j=0;j<n;j++) { //imprime populares
  115. cout<<ar[j].get_name()<<endl;
  116. }
  117.  
  118. for (int u=0;u<11;u++) { //imprime booleana
  119. for(int v=0;v<11;v++){
  120. cout<<mat[u][v];
  121. }
  122. }
  123. back(r, s, mat, sol, t , n);
  124.  
  125. return 0;
  126. }
  127.  
  128.  
6  Programación / Programación C/C++ / segmentation al ordenar un arreglo de objetos en: 19 Mayo 2015, 22:51 pm
Hola tengo un arreglo de objetos que se trata de un parque de diversiones en el cual cada atraccion tiene dos atributos su nombre (string) y su nivel de diversion (int).

yo leo 3 valores m que es la cantidad de atracciones, que es mayor a 1 y menor 100000; un n  n<=10 que son la cantidad de atracciones populares, osea, las atracciones que tienen un nivel de divesion mas alto y tambien leo un valor h que por ahora no lo estoy usando pero despues lo usare por que son para leer las aristas con las que se conectaran las atracciones,

por ahora mi problema es que tengo que ordenar ese arreglo de mayor a menor ya que las atracciones con mayor nivel de diversion van primero...

entrada:
5 3 3(este ultimo valor no hace nada todavia no es importante para el ordenar)
montaña_rusa 30
carritos_chocones 50
barco_pirata 40
tazas_locas 10
casa_terror 20

por lo tanto tendria que estar ordenado de:
carritos_chocones
barco_pirata
montaña_rusa
casa_terror
tazas_locas

y el programa deberia imprimir es:

carritos_chocones
barco_pirata
montaña_rusa


y bueno yo estaba usando el ordenamiento de seleccion (selection sort) que es de menor a mayor pero lo modifique como yo crei para poder ordenarlo ascendentemente, pero mi problema es que no me ordena, me da segmentation y nunca antes habia ordenado un arreglo de objetos y tengo dudas con eso, podrian ayudarme por favor con el codigo.

Código
  1. //jose luis silva 24.900.481 sección: c4
  2.  
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6.  
  7. class atraccion {
  8. private:
  9. int x;
  10. string name;
  11. public:
  12.  
  13. atraccion () {}
  14. atraccion (int var, string nnombre){
  15. x=var;
  16. name = nnombre;
  17. }
  18. ~atraccion() {}
  19.  
  20. void set_x (int val) { //modifica el x
  21. x = val;
  22. }
  23.  
  24. int get_x () { //devuelve el x
  25. return x;
  26. }
  27.  
  28. void set_name ( string nom) { //modifica el nombre
  29. name =nom;
  30. }
  31.  
  32. string get_name () { //devuelve el nombre
  33. return name;
  34. }
  35. };
  36.  
  37. int main (){
  38. int m, n, h,div;
  39. int posmayor,mayor;
  40. string nombre;
  41. atraccion intercambio;
  42.  
  43. cin>>m>>n>>h;
  44.  
  45. atraccion ar [m]; //arreglo que almacena cada atraccion
  46.  
  47. for (int i=0;i<m;i++) {
  48. cin>>nombre;
  49. cin>>div;
  50. ar[i].set_name(nombre);
  51. ar[i].set_x (div);
  52. }
  53.  
  54. for (int w=0;w<=m-2;w++){ //ordenamiento
  55. posmayor = w;
  56. mayor = ar[w].get_x();
  57. for (int k=w+1; k<=m-1; k++){
  58. if (ar[k].get_x() > mayor) {
  59. mayor = ar[k].get_x();
  60. posmayor =k;
  61. }
  62. }
  63.  
  64. intercambio = ar[posmayor];
  65. ar[posmayor] =ar[w];
  66. ar[w] = intercambio;
  67. }
  68.  
  69. for (int j=0;j<n;j++) {
  70. cout<<ar[j].get_name()<<endl;
  71. }
  72.  
  73. return 0;
  74. }
  75.  
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines