Error en el uso del fork()

Iniciado por nolasco281, 5 Abril 2014, 12:56 PM

0 Miembros y 1 Visitante están viendo este tema.

nolasco281

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.
Lo que se puede imaginar... se puede programar.

ivancea96

¿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?

nolasco281

Lo que se puede imaginar... se puede programar.

ivancea96

int *valor = (int*)malloc(sizeof(int));

Pon el (int*) delante.

nolasco281

Hola gracias por responder

este es el ejemplo que sigo



y su salida es esta.



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



la pregunta es por que pasa esto
Lo que se puede imaginar... se puede programar.

ivancea96

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í.

nolasco281

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.
Lo que se puede imaginar... se puede programar.

ivancea96

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.

nolasco281

creo que entendí gracias por responder y sacarme de las dudas.

saludos y muchas gracias.
Lo que se puede imaginar... se puede programar.

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language