Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: nolasco281 en 5 Abril 2014, 12:56 pm



Título: Error en el uso del fork()
Publicado por: nolasco281 en 5 Abril 2014, 12:56 pm
Hola están.

tengo un peque~no problema estaba estudiando el concepto de procesos y como estos funcionan.

llegue a una parte del libro que habla de los fork();

y muestra un ejemplo que es para la creación de un nuevo proceso.

El problema es que al momento de ejecutar la aplicación me muestra el siguiente error.

Código
  1. /invalid conversion from ‘void*’ to ‘int*[-fpermissive]|

Este es el codigo.

Código
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5.  
  6. int main (void)
  7. {
  8.    int *valor = malloc(sizeof(int));
  9.    *valor = 0;
  10.    fork();
  11.    *valor = 13;
  12.    printf("%ld: %d\n", (long)getpid(), *valor);
  13.  
  14.    free(valor);
  15.  
  16.    return 0;
  17. }

Gracias. también se me olvidaba tal ves me lo pueden explicar un poco mas claro, tengo el concepto un poco confuso todavía. saludos.


Título: Re: Error en el uso del fork()
Publicado por: ivancea96 en 5 Abril 2014, 13:06 pm
¿Qué tiene que ver ese int* con el fork?

El problema es que al momento de ejecutar la aplicación me muestra el siguiente error.

¿Error al ejecutar la aplicación, o a compilar?


Título: Re: Error en el uso del fork()
Publicado por: nolasco281 en 5 Abril 2014, 13:09 pm
Al compilar la aplicación.


Título: Re: Error en el uso del fork()
Publicado por: ivancea96 en 5 Abril 2014, 13:14 pm
Código
  1. int *valor = (int*)malloc(sizeof(int));

Pon el (int*) delante.


Título: Re: Error en el uso del fork()
Publicado por: nolasco281 en 5 Abril 2014, 13:22 pm
Hola gracias por responder

este es el ejemplo que sigo

(https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-mp3ReTPTPyQ%2FUz_ls58o-tI%2FAAAAAAAAAoA%2Fz2ZkpNS5E8U%2Fs1600%2Ffork1.png&container=blogger&gadget=a&rewriteMime=image%2F*)

y su salida es esta.

(https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-xCtkQ0kyDYE%2FUz_m2anhRPI%2FAAAAAAAAAoI%2F8nWbKh-IrBs%2Fs1600%2Fsalida1.png&container=blogger&gadget=a&rewriteMime=image%2F*)

con la modificación que tu apuntas la salida es esta.

(https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-7HkqIPngy44%2FUz_nU4vewUI%2FAAAAAAAAAoQ%2FqQ8aD7IR4IU%2Fs1600%2Fejec1.png&container=blogger&gadget=a&rewriteMime=image%2F*)

la pregunta es por que pasa esto


Título: Re: Error en el uso del fork()
Publicado por: ivancea96 en 5 Abril 2014, 13:29 pm
getPid() retorna el Proccess ID (PID) del proceso actual. Con Fork, partes el proceso en 2. Cada uno, a partir de el fork(), seguirá su camino. Así que cada uno hace un printf() de su PID, más el "valor".

Supongo que lo de int* será para comprobar si la memoria se comparte entre los procesos, o algo así.


Título: Re: Error en el uso del fork()
Publicado por: nolasco281 en 5 Abril 2014, 13:35 pm
Si es correcto lo que indicas el proceso padre y el hijo, pero me gustaria saber por que al poner (int*) si logro correr. no capto mucho esa parte.

gracias por responder.


Título: Re: Error en el uso del fork()
Publicado por: ivancea96 en 5 Abril 2014, 13:38 pm
malloc() retorna un dato del tipo void*, un puntero a void. Tenemos que convertir ese puntero a void, a un puntero a int. Poniendo "(tipo)" antes de un dato, lo convertimos al tipo que queramos (si es posible).

Si tenemos:

Código
  1. float f=1.5;
  2. int n=(int)f;

Así lo transformamos. Este ejemplo es absurdo, ya que esto se hace automáticamente, no es necesario poner el "(int)", pero es para que veas como iría.


Título: Re: Error en el uso del fork()
Publicado por: nolasco281 en 5 Abril 2014, 13:42 pm
creo que entendí gracias por responder y sacarme de las dudas.

saludos y muchas gracias.


Título: Re: Error en el uso del fork()
Publicado por: rir3760 en 5 Abril 2014, 16:08 pm
me gustaria saber por que al poner (int*) si logro correr. no capto mucho esa parte.
Ese programa es C y si se compila como tal utilizando la linea de comandos:
Código:
gcc.exe -c -ansi -pedantic -Wall -O main.c -o main.tmp
La compilación ocurre sin ningún problema.

Por otra parte si por alguna extraña razón se compila como C++ con:
Código:
g++.exe -std=c++98 -pedantic -Wall -O -c main.cpp
Se presenta el mensaje que mencionas.

Ello se debe a que en C puedes almacenar un valor de tipo "void *" en una variable de tipo puntero sin importar el tipo apuntado (siempre y cuando sea un puntero a objeto, los punteros a función se manejan aparte) pero en C++ se debe realizar la conversión de forma explicita (ejemplo y solución cortesía de ivancea96).

Un saludo


Título: Re: Error en el uso del fork()
Publicado por: nolasco281 en 5 Abril 2014, 23:39 pm
Muy cierto lo estaba compilando como c++ ya lo realice con C y no recibí ningún error muchas gracias por la explicación.

saludos a todos y gracias de nuevo.