Questa è una sorta di una questione tecnica, forse mi può aiutare se sai di C e UNIX (o forse è una domanda davvero newbie!)A proposito di puntatori dopo fork()
Una domanda si avvicinò oggi, mentre analizzando alcuni codici nel nostro corso sui sistemi operativi. Stiamo imparando cosa significa "forgiare" un processo in UNIX, sappiamo già che crea una copia del processo corrente parallelamente ad esso e hanno sezioni separate di dati.
Ma poi ho pensato che forse, se si crea una variabile e un puntatore che punta su di esso prima di fare fork(), perché il puntatore memorizza l'indirizzo di memoria della variabile, si potrebbe provare a modificare il valore di tale variabile da il processo figlio usando quel puntatore.
abbiamo provato un codice simile a questo in classe:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
int main(){
int value = 0;
int * pointer = &value;
int status;
pid_t pid;
printf("Parent: Initial value is %d\n",value);
pid = fork();
switch(pid){
case -1: //Error (maybe?)
printf("Fork error, WTF?\n");
exit(-1);
case 0: //Child process
printf("\tChild: I'll try to change the value\n\tChild: The pointer value is %p\n",pointer);
(*pointer) = 1;
printf("\tChild: I've set the value to %d\n",(*pointer));
exit(EXIT_SUCCESS);
break;
}
while(pid != wait(&status)); //Wait for the child process
printf("Parent: the pointer value is %p\nParent: The value is %d\n",pointer,value);
return 0;
}
Se lo si esegue, si otterrà qualcosa di simile:
principale: il valore iniziale è 0
Bambino: proverò a modificare il valore
Bambino: il valore del puntatore è 0x7fff733b0c6c
bambini: ho impostato il valore su 1
principale: il valore del puntatore è 0x7fff733b0c6c Parent
: Il valore è 0
E 'ovvio che il processo figlio non ha influenzato in tutto il processo genitore. Francamente, mi aspettavo qualche errore di "segmentation fault", a causa dell'accesso a un indirizzo di memoria non consentito. Ma cosa è successo veramente?
Ricorda, non sto cercando un modo per comunicare i processi, non è questo il punto. Quello che voglio sapere è che cosa ha fatto il codice. All'interno del processo figlio, il cambiamento è visibile, quindi ha fatto qualcosa.
La mia ipotesi principale è che i puntatori non sono assoluti alla memoria, sono relativi allo stack del processo. Ma non sono stato in grado di trovare una risposta (nessuno in classe lo sapeva, e googlando ho appena trovato alcune domande sulla comunicazione di processo) quindi mi piacerebbe sapere da voi, si spera che qualcuno lo sappia.
Grazie per aver dedicato del tempo a leggere!
è possibile inserire 'printf (" Parent: il valore del puntatore è% p \ nIl valore è% d \ n ", puntatore, valore);' nel caso predefinito di 'switch()' – Haris
http://en.wikipedia.org/wiki/Virtual_memory – Mat
"* Francamente, mi aspettavo qualche errore di" segmentation fault ", a causa dell'accesso a un indirizzo di memoria non consentito. *" Non ha senso. Pensaci. Il codice che il bambino esegue è perfettamente legale. L'unica domanda è - lo fa o non interessa il genitore? –