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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: [1] 2
1  Programación / Programación C/C++ / Problema con buzones en: 4 Abril 2019, 18:47 pm
Hola!
Estaba haciendo un ejercicio en el cual hay que sincronizar varios procesos y que estos procesos sigan sincronizandose (en este caso los procesos son unos semaforos que tienen que ir cambiando de color de forma logica osea cuando uno este en verde el otro no puede estar en verde y viceversa) hasta que se pulse ctrl-c.
El caso es que  mi idea era realizar esta sincronizacion con un buzon IPC pero el problema viene que despues de la primera interaccion del bucle infinito el programa ya no vuelve a cambiar de color los semaforos, es decir, si inicialmente los semaforos estan uno a verde y otro a rojo  el programa entra en el bucle y cambia el verde a rojo y el rojo a verde SOLO 1 vez (el objetivo es que este cambio se produzca continuamente).
Dejo aqui el codigo:

Código
  1. int buzon = atoi(p_memC+334); //el buzon esta correctamente inicializado y guardado en memoria compartida
  2.        int envio, recibo;
  3.  
  4.        struct tipo_mensaje
  5. {
  6.        long tipo;
  7.        char mensaje[20];
  8. }mensaje;
  9.  
  10.        while(1){
  11.  
  12.        if(*(p_memC+274) == VERDE)      //aqui se comprueba el estado del semaforo horizontal, el estado lo actualiza automaticamente luz_sem
  13.        {
  14.        luz_sem(HORIZONTAL, ROJO);
  15.        strcpy(mensaje.mensaje, "HORIZ ROJO");
  16.        mensaje.tipo = HORIZONTALROJO;
  17.        if((envio = msgsnd(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), MSG_NOERROR))==-1)
  18.        {
  19.                perror("msgnd");
  20.                raise(SIGINT);
  21.        }
  22.        }else if(*(p_memC+274) == ROJO){
  23.                mensaje.tipo=VERTICALROJO;
  24.                if((recibo=msgrcv(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), mensaje.tipo, MSG_NOERROR))==-1)
  25.                {
  26.                        perror("msgrcv");
  27.                        raise(SIGINT);
  28.                }
  29.  
  30.        luz_sem(HORIZONTAL, VERDE);        //esta es una funcion que esta comprobada que funciona correctamente para cambiar el semaforo de color
  31.  
  32.        }else if(*(p_memC+275) == VERDE){      //aqui se comprueba el estado del semaforo horizontal, el estado lo actualiza automaticamente luz_sem
  33.         luz_sem(VERTICAL, ROJO);
  34.         strcpy(mensaje.mensaje, "VERTICAL ROJO");
  35.         mensaje.tipo = VERTICALROJO;
  36.         if((envio = msgsnd(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), MSG_NOERROR))==-1)
  37.         {
  38.                perror("msgnd");
  39.                raise(SIGINT);
  40.         }
  41.        }else if(*(p_memC+275) == ROJO){
  42.                mensaje.tipo=HORIZONTALROJO;
  43.                if((recibo=msgrcv(buzon, &mensaje, sizeof(struct tipo_mensaje)-sizeof(long), mensaje.tipo, MSG_NOERROR))==-1)
  44.                {
  45.                        perror("msgrcv");
  46.                        raise(SIGINT);
  47.                }
  48.         luz_sem(VERTICAL, VERDE);
  49.        }
  50. }

Muchas gracias!
2  Programación / Programación C/C++ / escribir en un fichero binario en: 20 Diciembre 2018, 11:30 am
Hola, buenas, estaba haciendo un pequeño programa en el que una parte consiste en crear un fichero "prueba.bin", proyectarlo en memoria y luego inicializarlo a cero para luego ya meterle los valores que vamos a usar. El problema es que para inicializarlo, no se como meter los 0 en formato binario, lo habia hecho con
Código
  1. sprintf(buffer, "0");
  2. write(archivo, buffer, strlen(buffer));

pero despues me di cuenta de que asi estaba mal, ya que si no me equivoco se guarda en buffer como string.

aqui os dejo el resto del codigo tambien, muchas gracias
Código
  1. int archivo, tam_fich=40;
  2. char * buffer2;
  3.  
  4. archivo=open("prueba.bin", O_RDWR | O_CREAT, 0777 );
  5. if(archivo == -1){
  6. perror("Abrir fichero");
  7. exit(1);
  8. }
  9. buffer2=mmap (0, tam_fich , PROT_READ | PROT_WRITE , MAP_SHARED, archivo , 0);
  10.  
  11. if(buffer2==MAP_FAILED){
  12. perror("MEMORIA");
  13. exit(1);
  14. }
  15.  
  16. /*aqui iria el codigo para guardar 10 ceros en formato binario*/
3  Programación / Programación C/C++ / cambiar de nombre a un proceso en: 4 Diciembre 2018, 19:47 pm
Hola buenas, estaba haciendo un pequeño programa en C en el cual a partir de un proceso padre creo un proceso hijo y muestro por pantalla el PID del padre y del hijo, además de eso quería que al ejecutarlo en segundo plano al hacer un ps el nombre del proceso hijo cambie de "padre" a "hijo". He leido que con un execl cambiando el argumento argv[0] por "hijo" debería de funcionar pero no me funciona.
Os adjunto aquí el código.
Muchas gracias!

Código
  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6.  
  7.  
  8. int main(int argc, char *argv[]){
  9.        //printf("%s\n", argv[0]);
  10. if(strcmp(argv[0],"hijo")==0){
  11. malo();
  12.  
  13. }else{
  14. switch(fork()){
  15. case -1:
  16. perror("padre"); exit(1);
  17. case 0:
  18. printf("%d: Soy el hijo\n", getpid());
  19. break;
  20. default:
  21. printf("%d: Soy el padre\n", getpid());
  22.  
  23.  
  24. }
  25. execl(argv[0],"hijo", NULL);
  26. //printf("%s", argv[0]);
  27.  
  28. }
  29. pause();
  30. //sleep(30);
  31.  
  32. }
4  Programación / Programación C/C++ / Re: problema con ficheros :/ en: 4 Junio 2018, 20:29 pm
¿Podrías pasar todo el código para entender que hace el conjunto?
Código
  1. [code=c]int crearVacia(ListaEnlazadaRef raiz){
  2. *raiz=NULL; //tipoNodo** <> ListaEnlazadaRef
  3. return 0; //tipoNodo*  <> ListaEnlazada
  4. }
  5.  
  6.  
  7. int estaVacia(ListaEnlazada raiz) {
  8. return (raiz==NULL);
  9.  
  10. }
  11.  
  12. int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info) {
  13. return insertarAntesDeNodo(raiz,NULL,info);
  14. }
  15.  
  16. int insertarAntesDeNodo(ListaEnlazadaRef raiz, tipoNodoRef pos, tipoInfoRef info){
  17. tipoNodoRef nuevo, anterior;
  18.  
  19. if((nuevo=creaNodo(info))==NULL){
  20. #ifdef DEBUG
  21. fprintf(stderr, "Error: creando nodo\n");
  22. #endif
  23. return -1;
  24. }else{
  25. if(estaVacia(*raiz) || pos==NULL || pos==*raiz){
  26. nuevo->sig=*raiz;
  27. *raiz=nuevo;
  28. }else{
  29. anterior=*raiz; //ant=*raiz
  30. while(anterior!=NULL && anterior->sig!=pos){
  31. anterior=anterior->sig;
  32.  
  33. }
  34.  
  35. if(anterior!=NULL){
  36. nuevo->sig=pos;
  37. anterior->sig=nuevo;
  38.  
  39. }else{
  40. free(nuevo);
  41. #ifdef DEBUG
  42. fprintf(stderr, "Error: posicion inexistente\n");
  43. #endif
  44. return -2;
  45. }
  46. }
  47. return 0;
  48. }
  49. }
  50.  
  51. int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info){
  52. tipoNodoRef ant;
  53.  
  54. if(estaVacia(*raiz) || *info < (*raiz)->info)
  55. return insertarNodoComienzo(raiz,info);
  56. else{
  57. ant=*raiz;
  58. while(ant->sig!=NULL && ant->sig->info < *info){
  59. ant = ant->sig;
  60. }
  61. return insertarDespuesDeNodo(raiz, ant, info);
  62. }
  63. }
  64.  
  65.    int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){
  66.  
  67.     int cont=0;
  68.     tipoNodoRef aux, nuevo;
  69.     FILE *fid;
  70.     tipoInfoRef info;
  71.  
  72.     if ((fid=fopen(nombreFichero, "r"))==NULL){
  73.    #ifdef DEBUG
  74.     fprintf(stderr, "Error: abriendo fichero\n");
  75.    #endif
  76.     return -1;
  77.     }else{
  78.     if(estaVacia(*raiz)){
  79.     crearVacia(raiz);
  80.     fscanf(fid, "%d ", info);
  81.     insertarNodoComienzo(raiz, info);
  82.     }
  83.     else if((fscanf(fid, "%d ", info))!=EOF){
  84.     while(fscanf(fid, "%d ", info)!=EOF){
  85.     aux=*raiz;
  86.     insertarOrdenada(&aux, info);
  87.     }
  88.  
  89.     }else{
  90.     fclose(fid);
  91.    #ifdef DEBUG
  92.     fprintf(stderr, "Error: leyendo fichero\n");
  93.    #endif
  94.     return -2;
  95.     }
  96.  
  97.     }
  98.     return 0;
  99.    }
[/code]

Y bueno aqui estaria la llamada en el main:
Código
  1. [code=c]printf("Introduce el nombre de la lista de la cual quieres coger los datos: ");
  2.     scanf("%s%*c", nombreFichero);
  3.     printf("Guardando fichero en lista: %d\n", cargarListaEnlazadaTexto(&raiz, nombreFichero));
  4.  
[/code]

(espero no haberme liado al copiar nada que no tenga que ver ni nada por el estilo :/ )
5  Programación / Programación C/C++ / Re: problema con ficheros :/ en: 4 Junio 2018, 19:10 pm
Te lías con los punteros:
seguro que estaVacia espera un puntero;
aux=*raiz; debería ser aux=raiz;
insertarOrdenada ¿espera un puntero a puntero?
Lo de los punteros esta bien, igualmente lo he revisado y al cambiarlo a como me has dicho me dan errorres :/
Igualmente voy a dejar aqui los prototipos de las funciones que uso y los typedefs:
Código
  1. typedef int tipoInfo;
  2.  
  3. typedef tipoInfo *tipoInfoRef;
  4.  
  5.  
  6.  
  7.  
  8. typedef struct tipoNodo {
  9. tipoInfo info;
  10. struct tipoNodo * sig;
  11. } tipoNodo;
  12. typedef tipoNodo *tipoNodoRef;
  13.  
  14.  
  15. typedef tipoNodo * ListaEnlazada;
  16. typedef ListaEnlazada *ListaEnlazadaRef;
  17.  
  18. /*Prototipos*/
  19.  
  20. int crearVacia(ListaEnlazadaRef raiz);
  21. int estaVacia(ListaEnlazada raiz);
  22. int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info);
  23. int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info);
6  Programación / Programación C/C++ / problema con ficheros :/ en: 4 Junio 2018, 14:50 pm
Hola buenas, me hayo haciendo un pequeño programa en C, en el cual una de las cosas que debe de hacer es crear una lista enlazada con los valores que le pasamos desde un fichero de texto, el problema es que al ejecutarlo me da "Violacion de segmento('core' generado)", y no encuentro el error.
El codigo que tengo es el siguiente:
Código
  1. int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){
  2.  
  3. int cont=0;
  4. tipoNodoRef aux, nuevo;
  5. FILE *fid;
  6. tipoInfoRef info;
  7.  
  8. if ((fid=fopen(nombreFichero, "r"))==NULL){
  9. #ifdef DEBUG
  10. fprintf(stderr, "Error: abriendo fichero\n");
  11. #endif
  12. return -1;
  13. }else{
  14. if(estaVacia(*raiz)){
  15. crearVacia(raiz);
  16. fscanf(fid, "%d ", info);
  17. insertarNodoComienzo(raiz, info);
  18. }
  19. else if((fscanf(fid, "%d ", info))!=EOF){
  20. while(fscanf(fid, "%d ", info)!=EOF){
  21. aux=*raiz;
  22. insertarOrdenada(&aux, info);
  23. }
  24.  
  25. }else{
  26. fclose(fid);
  27. #ifdef DEBUG
  28. fprintf(stderr, "Error: leyendo fichero\n");
  29. #endif
  30. return -2;
  31. }
  32.  
  33. }
  34. return 0;
  35. }

**Todas las funciones a las que llamo dentro de la funcion funcionan a la perfeccion.
7  Programación / ASM / adressing mode error en: 18 Mayo 2018, 18:22 pm
Hola muy buenas. Estaba haciendo un codigo en asm6809 y no me funcionaba bien pero si me compilaba, quite unas lineas del final para ir viendo poco a poco como cambiarlo y ahora me da dos errores en una parte que no he modificado:

Código
  1. programa:
  2. std nuevo ;guardo el numero generado en nuevo
  3.  
  4. cmpu #pilaU ;miro si la lista esta vacia comparando U con la direccion inicial que le hemos cargado #pilaU
  5. bne subrutina
  6.  
  7. vacia: ;si la lista esta vacia la inicio
  8. pshu nuevo
  9. pshu #0x0000
  10. ldx #nuevo
  11. stx anterior
  12.  
  13. subrutina:
  14. ldx anterior
  15. ldd ,-x
  16. cmpd nuevo
  17. bhs insertar_despues;esta parte ya no la tengo hecha por lo que ahora mismo no existe insertar despues
  18. rts

El error de adressing mode me lo da excatamente en el pshu nuevo y pshu #0x0000
8  Programación / ASM / Re: ensamblador dudas en: 18 Mayo 2018, 18:18 pm
Invalid OpCode, ¿dónde?
Muchas gracias por preguntar pero ya lo he conseguido corregir. De todas maneras te respondo, me daba invalid opcode al final del programa, no recuerdo ya exactamente el lugar
9  Programación / ASM / ensamblador dudas en: 16 Mayo 2018, 16:35 pm
Hola, buenas.
Quería ver si alguien me podría ayudar con un pequeño programita en ensamblador asm 6809.
El programa consiste en pedir una semilla inicial para generar tantos numeros aleatorios como indique la semilla y se van imprimiendo dichos números en pantalla. Despues de esto se tienen que mostrar de nuevo esa lista de numeros pero que dichos numeros aparezcan de manera ordenada.
Tengo ya las subrutinas en ficheros a parte hechas (leer_decimal, rand, srand, imprimir_decimal_ imprimir_cadena) y todas ellas por separado funcionan correctamente.
A la hora de hacer el main para llevar a cabo lo descrito antes con tan solo el codigo que dejo aqui abajo me da un error: "invalid opcode"
        
Código
  1.  .module main
  2.  
  3.            ;definimos constantes
  4. teclado     .equ 0xFF02
  5. fin         .equ 0xFF01
  6. pantalla    .equ 0XFF00
  7.  
  8.            ;.org 0x100
  9.    .globl programa
  10.    .globl rand
  11.    .globl srand
  12.    .globl leer_decimal
  13.    .globl imprime_cadena
  14.  
  15.  
  16. cont: .word 0
  17.  
  18. introduc_sem: .ascii "Introduce semilla:"
  19.      .byte 0
  20.  
  21.  
  22. programa:
  23. ldx #0xE000
  24. lda introduc_sem
  25. jsr leer_decimal
  26. std cont
  27. jsr srand
  28. std ,--x
  29.  
  30.  
  31. bucle: jsr rand
  32.       std ,--x
  33.       ldd cont
  34.       addd #0xFFFF
  35.       cmpd #0
  36.       bne bucle
  37.  
  38.  
  39. acabar:
  40. clra
  41. sta fin
  42.  
  43. .area FIJA (ABS)
  44. .org 0xFFFE ; vector de RESET
  45. .word programa



Se me ha olvidado mencionar que lo que se supone que estoy intentando hacer en este fragmento de codigo es pedir la semilla, generar los numeros aleatorios y guardarlos en el registro X para no perder los numeros generados


· No se debe hacer doble post
>aquí las reglas del foro
-Engel Lex
10  Programación / Programación C/C++ / Re: operaciones con fracciones [me compila pero tiene un fallo y no lo encunetro] en: 27 Febrero 2018, 14:47 pm
Línea 63:
Código:
scanf("%c", &operacion);
operacion ya es un puntero y no debes usar el &. Debe quedarte así:
Código:
scanf("%c", operacion);


Sabía que sería algun detalle así. Muchas gracias!
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines