[ Foro de C ]

Procesos fork

15-Sep-2021 02:41
Invitado (Iv?n rodellas garc?a)
0 Respuestas

all: fork.c
gcc -Wall -ggdb  -o fork fork.c


Qué es ggdb

Ejemplo de un makefile de un proceso fork, necesito listados de 40k o 80k de procesos fork


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

int main(void)
{
       pid_t pid;
char cwdir_child[100];
char cwdir_parent[100];

if ((pid = fork()) < 0) {
       perror("fork error");
exit(1);
}

if (pid == 0) {
 /* We are in the childs thread
  *  lets change the directory to /tmp */
               if(chdir("/tmp") < 0) {
               perror("chdir error");
}
/*  Let's print the current working directory of the child
*/
if (getcwd(cwdir_child, 100) != NULL) {
       printf("The directory of the child is : %s\n", cwdir_child);
} else {
       perror("getcwd client error");
}
/* end of the child process */
} else {
 /* Now we are in the parent process
  * Let's check the current working directory */
       if (getcwd(cwdir_parent, 100) != NULL) {
       printf("The directory of the parent is : %s\n", cwdir_parent);
} else {
       perror("getcwd parent error");
}
}
return(0);
}



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

int main(void)
{
       pid_t pid;
char cwdir_child[100];

if ((pid = fork()) < 0) {
       perror("fork error");
exit(1);
}

if (pid == 0) {
 /* We are in the childs thread
  *  lets change the directory to /tmp */
               if(chdir("/tmp") < 0) {
               perror("chdir error");
}
/*  Let's print the current working directory of the child
*/
if (getcwd(cwdir_child, 100) != NULL) {
       printf("The directory of the child is : %s\n", cwdir_child);
} else {
       perror("getcwd client error");
}
/* end of the child process */
} else {
 /* Now we are in the parent process
  * Let's check the current working directory */
       if (getcwd(cwdir_child, 100) != NULL) {
       printf("The directory of the parent is : %s\n", cwdir_child);
} else {
       perror("getcwd parent error");
}
}
return(0);
}



La función de exit (0) es en realidad finalizar un proceso, en este punto return 0 tiene la misma función que él.

Dado que el proceso se puede finalizar, ¿podemos crear el proceso artificialmente? En este momento necesitamos la ayuda de la función fork.

#include <unistd.h>
int fork(void);

   1
   2

El papel de la función fork es crear un proceso hijo en el proceso padre original, el proceso hijo recién creado es casi, pero no completamente, el mismo que el proceso padre. El proceso secundario obtiene la misma copia (pero independiente) del usuario y el espacio de direcciones virtuales del proceso principal, incluidos los segmentos de código y datos, el montón, la biblioteca compartida y la pila de usuarios. El proceso secundario también obtiene la misma copia de cualquier descripción de archivo abierto del proceso principal , Lo que significa que cuando el proceso padre llama a fork, el proceso hijo puede leer y escribir cualquier archivo abierto en el proceso padre. La mayor diferencia entre el proceso padre y el proceso hijo recién creado es que tienen diferentes PID (números de proceso de ID de proceso).

La función fork es muy interesante, la función fork tiene una característica: llamarla una vez y regresar dos veces. ¿Como entender? Devuelve dos veces en el proceso padre y una vez en el proceso hijo. En el proceso padre, fork devuelve el PID del proceso hijo. En el proceso hijo, fork devuelve 0. Debido a que el PID de la Ciudad Prohibida siempre es distinto de cero, el valor de retorno puede indicar si se está ejecutando el proceso principal o el proceso secundario. Podemos mirar un ejemplo para profundizar nuestra comprensión.

Ejecute el siguiente código en el sistema Linux:
Ejemplo 1:


https://repositorioinstitucional.ceu.es/bitstream/10637/9343/5/SOS-Practica_1_RGarciaCarmona_2014.pdf



A que se refiere con <<con direcciones virtuales>>



Mirare en la web





(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)