Dado que una función en C solo devuelve un valor, todo el tiempo, ¿cómo puede fork()
, que también es una función, devolver dos valores?¿Cómo es posible que fork() devuelva dos valores?
Respuesta
Si lee, compila y ejecuta el siguiente programa, debe tener una mejor idea de lo que está sucediendo.
#include <stdio.h>
#include <unistd.h>
int main(void) {
pid_t fk;
printf("\tbefore fork my pid = %lu\n", (unsigned long)getpid());
fflush(stdout); /* This may keep the above print
statement from outputing twice. */
fk = fork(); /* The OS kernel makes a copy of the current process here */
printf("fork returned %lu and now my pid = %lu\n",
(unsigned long)fk, (unsigned long)getpid());
return 0;
}
La razón por la que se necesita la fflush(stdout)
es que, dado que el proceso se duplica por el tenedor que significa que el búfer hecho por la salida estándar por stdio se duplica también. La "\ n" al final de la primera declaración de impresión puede hacer que siga adelante y eliminar stdout, pero esto no está garantizado.
La función de bifurcación devuelve 0 en el proceso hijo que se creó y devuelve la ID del hijo al proceso principal.
Cada uno de los dos procesos tiene un único valor.
Por lo tanto, piense en ello más como una devolución llamada en cada proceso de la rosca.
fork
no devuelve dos valores. Inmediatamente después de una llamada al sistema fork
, simplemente tiene dos procesos independientes ejecutando el mismo código, y el pid devuelto desde fork
es la única forma de distinguir en qué proceso se encuentra: el padre o el hijo.
Como Gnostus dice, la función tenedor() no devuelve dos valores.
Lo que hace es devolver un solo valor, como lo hacen todas las funciones, pero vuelve dos veces.
Una vez dentro del proceso principal y una vez dentro del elemento secundario. El proceso principal obtiene la ID de proceso del niño devuelta, el niño obtiene 0, una identificación de proceso no válida, por lo que el código puede indicar que es el hijo.
El elemento secundario es un proceso nuevo, ejecuta el mismo código y está en el mismo lugar en el código que el elemento primario que lo generó.
int cProcessID;
cProcessID = fork();
if (cProcessID == 0) {
// Child process
} else {
// Parent process
}
La idea clave es pensar en el hecho de que después de fork()
tiene realmente dos copias de de su programa. Estos son dos procesos, que ejecutan la misma copia exacta de su código, y el puntero de ejecución está exactamente en la misma línea de código, es decir, fork()
, listo para regresar.
El sistema operativo organiza el fork()
para devolver en el proceso principal con el pid del hijo, y para que regrese en el proceso secundario con cero (si las cosas van bien).
Es por eso que dicen que fork()
regresa dos veces. Una vez en cada proceso.
- 1. ¿Es posible que una subconsulta devuelva dos valores?
- 2. ¿Es posible que SelectNodes en un XmlDocument devuelva nulo?
- 3. fork() y wait() con dos procesos secundarios
- 4. ¿Es posible que mysqli_insert_id devuelva una identificación incorrecta en aplicaciones de alto tráfico?
- 5. ¿Es posible que class.property = x devuelva algo que no sea x?
- 6. ¿Cómo hago que MySQL devuelva UTF-8?
- 7. ¿Es posible que un constructor de javascript devuelva diferentes tipos de objetos?
- 8. ¿Es posible que nhibernate devuelva una consulta como IDictionary en lugar de una clase de entidad?
- 9. ¿Cómo obtengo System.Windows.ShowDialog() para que devuelva 'verdadero'?
- 10. ¿Es posible hacer que un parámetro implemente dos interfaces?
- 11. Cómo hacer que BackgroundWorker devuelva un objeto
- 12. ¿Cómo funciona una Llamada bajo el capó? ¿Cómo es posible que un objeto invocable devuelva un valor?
- 13. ¿Cuál es la diferencia entre llamar a daemon() y llamar a fork(), setsid(), fork(), etc.?
- 14. ¿Es posible comparar dos imágenes en Javascript?
- 15. ¿Es posible abrir el UINavigationController dos veces?
- 16. Enlace a dos valores
- 17. Cómo hacer que Integer.toBinaryString devuelva al menos 4 bits
- 18. cómo actualizar GUI desde swingworker que devuelve dos valores diferentes
- 19. ¿Cómo crear diferentes pendientes para que filterEquals() devuelva false?
- 20. ¿Cómo comparar dos valores dobles en Java?
- 21. Cómo hacer que boost asio fork sea seguro
- 22. ¿Está bien que devuelva None desde __new__?
- 23. ¿Qué causa que WriteFile devuelva ERROR_ACCESS_DENIED?
- 24. underscore.js - ¿Hay una función que produce una matriz que es la diferencia de dos matrices?
- 25. Cómo obtener que Solr Suggester devuelva sugerencias de ortografía también
- 26. ¿Cómo puedo hacer que XHR.onreadystatechange devuelva su resultado?
- 27. C# ¿Es posible pasar un tipo a un método y hacer que el método devuelva un objeto de ese tipo?
- 28. Evitar que ArrayList.Add() devuelva el índice
- 29. ¿Cómo configuro Apache para que devuelva un código 204?
- 30. ¿Cómo hacer que un método asíncrono devuelva un valor?
Una devolución para cada proceso, no hilo. –