Test Foro de elhacker.net SMF 2.1

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.

/invalid conversion from 'void*' to 'int*' [-fpermissive]|

Este es el codigo.

Código (cpp) [Seleccionar]

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main (void)
{
   int *valor = malloc(sizeof(int));
   *valor = 0;
   fork();
   *valor = 13;
   printf("%ld: %d\n", (long)getpid(), *valor);

   free(valor);

   return 0;
}


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?

Cita de: nolasco281 en  5 Abril 2014, 12:56 PM
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
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:

float f=1.5;
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
Cita de: nolasco281 en  5 Abril 2014, 13:35 PMme 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:
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:
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.