Poiché una funzione in C restituisce solo un valore, sempre, come può fork()
, che è anche una funzione, restituisce due valori?Come è possibile che fork() restituisca due valori?
risposta
Se leggi, costruisci ed esegui il seguente programma dovresti avere una migliore idea di cosa sta succedendo.
#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 ragione per cui la fflush(stdout)
è necessario è che, poiché il processo è ripetuto dalla forcella che significa che il buffer fatto per stdout da stdio viene duplicato pure. Il "\ n" alla fine di quella prima stampa può far andare avanti e svuotare lo stdout, ma questo non è garantito.
La funzione di fork restituisce 0 al processo figlio che è stato creato e restituisce l'ID childs al processo padre.
I due processi separati restituiscono ciascuno un valore singolo.
Quindi pensateci più come un ritorno viene chiamato su ogni processo thread.
fork
non restituisce due valori. Subito dopo una chiamata di sistema fork
hai semplicemente due processi indipendenti che eseguono lo stesso codice, e il pid restituito da fork
è l'unico modo per distinguere in quale processo sei - genitore o figlio.
Come Gnostus dice, la funzione fork() non restituisce due valori.
Quello che fa è restituire un valore singolo, come tutte le funzioni, ma restituisce due volte.
Una volta all'interno del processo padre e una volta all'interno del bambino. Il processo genitore ottiene l'ID di processo del figlio restituito, il bambino ottiene 0 - un ID di processo non valido, quindi il codice può dire che è il figlio.
Il figlio è un nuovo processo, esegue lo stesso codice e si trova nello stesso punto del codice del genitore che lo ha generato.
int cProcessID;
cProcessID = fork();
if (cProcessID == 0) {
// Child process
} else {
// Parent process
}
L'intuizione chiave qui è di pensare al fatto che dopo un fork()
hai davvero due copie del tuo programma. Si tratta di due processi, che eseguono la stessa copia esatta del codice e il puntatore di esecuzione si trova esattamente sulla stessa riga di codice, ovvero fork()
, pronto a tornare.
Il sistema operativo consente al fork()
di ritornare nel processo padre con il pid del figlio e di farlo tornare nel processo figlio con zero (se le cose vanno bene).
Ecco perché si dice che fork()
restituisce due volte. Una volta in ogni processo
- 1. È possibile che DbContext.SaveChanges() restituisca 0 ma non abbia un'eccezione?
- 2. È possibile che mysqli_insert_id restituisca un ID errato nelle applicazioni ad alto traffico?
- 3. È possibile confrontare due cursori?
- 4. È possibile creare una funzione in MATLAB che non restituisca nulla?
- 5. fork() e wait() con due processi figlio
- 6. È garantito che mclapply restituisca i suoi risultati in ordine?
- 7. È possibile sincronizzare automaticamente i fork in gitHub?
- 8. Impossibile che un servizio SOAP WCF restituisca JSON come output?
- 9. E 'possibile che nhibernate restituisca una query come IDictionary invece di una classe di entità?
- 10. Associazione a due valori
- 11. Jquery - Riferimento per ID - Si suppone che restituisca un array?
- 12. Gitlab: È possibile creare una richiesta di fusione da MY fork a Un altro fork dello stesso progetto
- 13. È possibile che il clojure valuti una catena di funzioni miste e restituisca una funzione parziale se necessario?
- 14. Qual è la differenza tra chiamare daemon() e chiamare fork(), setsid(), fork(), ecc.?
- 15. È possibile confrontare due immagini in Javascript?
- 16. È possibile che ConcurrentHashMap "deadlock"?
- 17. È possibile far apparire UINavigationController due volte?
- 18. Android: non è possibile avere due addTextChangedListener per due EditText?
- 19. È possibile collegare insieme due draggables jquery.ui?
- 20. Funzione Fork() in C
- 21. Come posso aspettare che una funzione javascript restituisca una risposta utilizzando l'API Chrome.storage?
- 22. Come è possibile che l'altezza UITableViewCellContentView è diverso da heightForRowAtIndexPath:
- 23. Dead simple Fork-Join Join in Clojure
- 24. restituisce due valori da webservice
- 25. Django: GROUP BY due valori
- 26. È possibile utilizzare Enum con valori Coppia come dizionario
- 27. Running fork (2) da Windows con Cygwin. Possibile?
- 28. In che modo è possibile scorrere due array contemporaneamente senza reiterare il ciclo principale?
- 29. In che modo è possibile utilizzare i tag delle mappe per due immagini che si sovrappongono?
- 30. C#: Assicurarsi che DateTime.Now restituisca una GMT + 1 ora
Un ritorno per ogni processo, non thread. –