|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 6139
|
[Sistemi operativi & C]chi mi spiega questa cosa?
Codice:
#include <stdio.h> #include <stdlib.h> #include <signal.h> void sigsegv_handler(int sig) { printf("Ricevuta una signal di segmentation fault (SIGSEGV).\n"); exit(0); } int main() { int *null_pointer=(int *)NULL; signal(SIGSEGV,sigsegv_handler); printf("Che succede qui di seguito?\n"); *null_pointer=0; printf("Perche’ non viene stampata questa riga?\n"); return 1; } Qlc è in grado di spigarmelo? Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 6139
|
quello che posso aver capito io è che essendo la variabile un puntatore ad interi, invece di passargli un puntatore gli passo un numero e quindi và in errore(segmentation).. può essere ?
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2001
Messaggi: 6139
|
a riprova di quello che ho detto:
Codice:
#include <stdio.h> #include <stdlib.h> #include <signal.h> void sigsegv_handler(int sig) { printf("Ricevuta una signal di segmentation fault (SIGSEGV).\n"); exit(0); } int main() { //int *null_pointer=(int *)NULL; int null_pointer; signal(SIGSEGV,sigsegv_handler); printf("Che succede qui di seguito?\n"); null_pointer=0; printf("Perche’ non viene stampata questa riga?\n"); return 1; } ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
il problema è che inizializzi quel puntatore al valore NULL, poi tenti di accedere all'area di memoria con indirizzo NULL e ovviamente hai un errore.
per farlo funzionare basterebbe qualcosa tipo Codice:
int a; int *pointer; pointer = &a; // &a vuol dire indirizzo della variabile a *pointer = 10; |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Apr 2002
Messaggi: 64
|
Se non ricordo male la mie antiche conoscenze di C, tu con
Codice:
int *null_pointer=(int *)NULL; Codice:
*null_pointer=0; Infatti, mi pare che *null_pointer usato in sede di definizione/dichiarazione cioè in Codice:
int *null_pointer=(int *)NULL; mentre *nullpointer usato in altri contesti come ad esempio in: Codice:
*null_pointer=0; Poi magari mi ricordo male ed ho detto una cavolata, quindi controlla, se puoi, in qualche manuale. Ciao |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ha ragione recoil...
Infatti il puntatore null_pointer è inzializzato a NULL (cioè 0), se faccio *null_pointer = 0; voglio andare a scrivere nella memoria all'indirizzo NULL il valore 0...e non è possibile ![]() |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Il programma in questione serve per mostrare come si catturano i segnali in C. Come gia' spiegato, viene creato un puntatore all'indirizzo 0, il quale e' un indirizzo invalido. Dopo di che si esegue la signal(), la quale significa: "In caso di errori quali, per esempio, il segmentation error, dovrai eseguire la funzione il cui nome e' sigsegv_handler". Puoi ben immaginare come questo sia molto utile in applicazioni molto complesse, per recuperare la situazione in caso di errori gravi. A questo punto, per dimostrare che effettivamente funziona, viene causato l'errore in questione: hai il puntatore all'indirizzo nullo e quindi provi a scriverci. (i.e. *null_pointer=0; ) Come conseguenza di questo, l'esecuzione del tuo programma normale viene interrotta (i.e. non vedi la "Perche’ non viene stampata questa riga?") e viene eseguita la "procedura di emergenza", la quale andra' a scrivere "Ricevuta una signal di segmentation fault (SIGSEGV)." DIMENTICAVO: un giorno scriverai (o lo stai gia' scrivendo) un programma molto grosso ed articolato in C++ e vorrai utilizzare anche queste funzioni per catturare dei segnali di tuo interesse. Fai attenzione ad una cosa: la semantica del C++ e quella del C non sempre sono compatibili! Sembra stranissimo (tutti infatti dicono che il C++ e' un sovrainsieme del C) ma e' cosi'! L'utilizzo di queste funzionalita' tipiche del C in un programma C++ puo' portare a comportamenti davvero strani, quali la mancata gestione delle eccezioni C++, costruttori non chiamati ed altre stranezze simili!
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 01-05-2007 alle 04:49. |
|
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
non è GPE
![]() inizialmente è un page fault, poi il sistema si accorge che il PF è causato non dal fatto che la pagina è stata swappata, ma dal fatto che non è stata manco allocata, e allora reagisce coi meccanismi suoi (signal handlers, SEH, <metti qui il tuo meccanismo preferito> ) ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:33.