C/Visual C - Duda con fork()

 
Vista:
sin imagen de perfil

Duda con fork()

Publicado por Ángel (19 intervenciones) el 25/08/2017 18:30:16
Tengo una duda al utilizar fork(), ya que cuando usas esta función te devuelve dos valores; 0 si es el hijo o un entero positivo si es el padre, lo que yo quiero saber es como los devuelve realmente, si da primero un valor y luego el otro si a la vez o como.
Y siguiendo con esto si tienes codigo en c, la programacion es secuencial, entonces por si te devuelve el forK()==0, y tienes codigo debajo y luego te devuelve otro valor, como se ejecutan las cosas?deja de ser secuencial?
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Duda con fork()

Publicado por Ángel (19 intervenciones) el 27/08/2017 09:30:08
Con lo que he leído he entendido que el hijo hace una copia del padre, y el hijo se empieza a ejecutar desde el fork(), y la ejecución es de forma concurrente, es correcto?
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con fork()

Publicado por Tom (619 intervenciones) el 27/08/2017 10:35:26
Entonces ... ¿ crees que tus preguntas iniciales tienen mucho sentido ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Duda con fork()

Publicado por Ángel (19 intervenciones) el 27/08/2017 10:36:45
No mucho la verdad jaja, pero es que vengo de java y no me entra en la cabeza lo de los procesos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con fork()

Publicado por Tom (619 intervenciones) el 27/08/2017 20:11:45
Pues lee sobre procesos, que es dónde quería llegar :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de SuperIndio(SoydeSalta)
Val: 47
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con fork()

Publicado por SuperIndio(SoydeSalta) (42 intervenciones) el 30/08/2017 16:23:39
Ahhhh bueno voy a echar luz sobre tanta oscuridad

En el concepto MULTIPROCESO, el MULTIPROCESO puede ser :
un proceso MULTIHILO o
un proceso MULTIPROCESO PROPIAMENTE DICHO.
la diferencia es que en el multihilo es la division de un proceso en hilos de ejecucion... como se hace?
en C + C++ se hace con la fucnion fork() en este caso cuando un hilo de ejecucion comparte aun las variables del hilo principal
y cuando finaliza vuelve al hilo principal de ejecucion....

En cambio en el MULTIPROCESO PROPIAMENTE DICHO se realiza con la funcion thread() es es un proceso totalmente distinto...
aunque se puede comunicar con el proceso principal
lo podes checkar y ver como un proceso distinto al del principal,
en cambio en el fork() no se ve por consola cuando se este ejecutando...
cuando digo linea de comando es ps -ef | grep nameproceso

en el thread() generalmete se usa conexiones tcp/ip , en este puedo o no usar una bolsa(select) y se usa para hacer un servidor de conexiones tcp/ip

1) generar el socket(pueto+ip)
2) Bind
3) Listen
4) aceptar conexiones(while)
5) recibir y responder a cada cliente (receive/send)


soy programador Networking hace varios años
utilizo fork(), Thread dedicados o Thread multihilo y alguna vez use bolsas(Thread + select())
Para usar cualquiera de estas soluciones hay que analizar porque y para que?
en eneral se usa en automatas o demonios en cambio thread se usa para hacer servidores tcp/ip
Fork() es solo para dividir procesos Ejemplo: Consultar un dato en una tabla oracle y dependiendo de su valor:
a) ejecuto un job
b) genero un reporte
3) envio un mail
4) lanzo otro proceso
5) inserto un dato en otra tabla
6) genero un archivo
7) bla bla bla
8) ble ble ble

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
printf("Eliminando el Informe de Cierre de Operaciones de Cajas \r\n");
printf("[ %s ] \n", cCmdRemove);
nRetVal = system( cCmdRemove ) ;
 
/*----------------------------------------------------*\
*  Se crea un proceso hijo (concurrente).
\*----------------------------------------------------*/
pid = fork();
 
/*----------------------------------------------------*\
*  Se verifica que se haya creado satisfactoriamente.
\*----------------------------------------------------*/
if (pid < 0)
{
 exit(EXIT_FAILURE);
}
else if (pid > 0)
{
 /*------------------------------------------------*\
  *  Si es el proceso padre, se sale del programa
 \*------------------------------------------------*/
  exit(EXIT_SUCCESS);
}
 
/*---------------------------------------------------*\
*  Asegurar que el acceso archivo no sea heredado
\*---------------------------------------------------*/
umask(0);
 
/*---------------------------------------------------*\
*  Usando setsid, separa el proceso y pone el demonio
*  dentro una nueva sesion
\*---------------------------------------------------*/
sid = setsid();
if (sid < 0)
{
  exit(EXIT_FAILURE);
}
 
printf("El Numero de Proceso AIX (_SID_):  %d \n", sid);
 
/*---------------------------------------------------*\
*  A partir de aqui comienza el codigo del demonio
*  printf("Detectando Operaciones de Caja\n");
\*---------------------------------------------------*/
while (1)
{
......
}


Aplico soluciones fork() y Thead() TCP/IP ( obvio por $$$$ en billetes verdes )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Duda con fork()

Publicado por Tom (619 intervenciones) el 30/08/2017 23:07:06
Bueno, por alguna razón que ignoro no puedo poner la respuesta que tu post se merece.
Pero creo que sí podré comentar que te has hecho un lío impresionante. Si en lo que comentas hubiera algo coherente, sería justo al revés de cómo lo explicas ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de SuperIndio
Val: 47
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con fork()

Publicado por SuperIndio (42 intervenciones) el 05/12/2018 15:23:17
Simple Tom, muy simple
el fork() es multihilo y depende del proceso padre y vuelve al proceso padre,
el thread() (multiproceso) puede llegar a ser totalmente independiente.
Y si matas el proceso padre o el que lo genero el o los procesos thread(s)
estos(los threads) pueden seguir ejecutandose no asi el fork()
Ojo dependera de la plataforma, en Aix y Qnx Neutrino funciona asi,
en Linux no lo he probado, no asi en windows, en win7 se cuelga, he recibido algunos insultos
de algunos programadores anti-Microsoft por haber perdido el
tiempo probando eso, en fin... Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Superindio
Val: 47
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con fork()

Publicado por Superindio (42 intervenciones) el 05/12/2018 15:42:56
En general el uso es distinto

El fork() yo lo uso en demonios y automatas y me dispara ciertos procesos segun la
presencia de ciertos archivos o el resulado de un select count(*) en una tabla oracle
y en caso de automatas cambia el estado segun horario u otro evento.

Y uso el Thread para tratar cadenas enviadas por socket y estos pueden venir
desde distintos clientes.
El proceso padre acepta la conexion y ejecuta un proceso hijitus al que le cede
el handle de la conexion por lo tanto es este(el thread) el que se encarga procesar esa cadena
y de responder al cliente una vez finalizado el tratamiento de dicha cadena.
al final cierra la conexion y se cierra su propia ejecucion, mientras tanto el proceso main o padre
ya esta aceptando otras conexiones y cediendo el control a otros threads...

Ademas existe otro tema con el tema de compartir variables...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar