000
29.12.2004, 14:28 Uhr
mike
Pinguinhüpfer (Operator)
|
Hallo Ich hab in meinem Buch eine Abschlussübung gemacht:
C++: |
#include <pwd.h> #include <signal.h> #include <stdio.h>
static void alrm_sighandler(int signr);
int main(void) { struct passwd *zgr;
if (signal(SIGALRM, alrm_sighandler) == SIG_ERR) fprintf(stderr, "ERROR: alrm_sighandler");
alarm(1);
while (1) { if ( (zgr = getpwnam("mysql")) == NULL) /*here insert a user from passwd*/ fprintf(stderr, "getpwnam-ERROR"); if (strcmp(zgr->pw_name, "mysql") != 0) printf("WRONG! pw_name = %s\n", zgr->pw_name); } }
static void alrm_sighandler(int signr) { struct passwd *rootzgr;
printf(".... In Signalhandler .....\n"); if ( (rootzgr = getpwnam("root")) == NULL) fprintf(stderr, "ERROR getpwnam(root)"); alarm(1); }
|
Zitat: |
Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... WRONG! pw_name = root .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... *** malloc[827]: Deallocation of a pointer not malloced: 0x3003a0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug *** malloc[827]: Deallocation of a pointer not malloced: 0x3003b0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug *** malloc[827]: Deallocation of a pointer not malloced: 0x300390; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug WRONG! pw_name = WRONG! pw_name = *** malloc[827]: Deallocation of a pointer not malloced: 0x3003d0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... WRONG! pw_name = *** malloc[829]: Deallocation of a pointer not malloced: 0x3003b0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug .... In Signalhandler ..... ^C Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$ ./nonreent .... In Signalhandler ..... .... In Signalhandler ..... *** malloc[830]: error for object 0x3003b0: Double free .... In Signalhandler ..... *** malloc[830]: Deallocation of a pointer not malloced: 0x3002b0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug Segmentation fault Michael-Vodeps-Computer:~/Desktop/proggen/sysprog Folder/lsg/kap13 michaelvodep$
|
Ich hab bei jedem Aufruf 10sec gewartet - das Verhalten des Programms hängt also vom Zufall ab.
Der Autor hat geschrieben:
Zitat: |
Das Ablaufgeschehen des Programms test.c hängt vom Zufall ab. Normalerweise wird dieses Programm bei der Rückkehr aus dem Signalhandler durch das Signal SIGSEGV beendet. Der Grund dafür ist, daß die main-Funktion bei einem getpwnam-Aufruf durch das Signal SIGALRM unterbrochen wurde. Da der dadurch aufgerufene Signalhandler nun einerseits petpwnam aufruft, führt dies dazu, daß gewisse interne Zeiger nun verändert werden und damit bei der Fortsetzung dieser Funktion (in main) nach der Rückkehr aus dem Signalhanlder keine gültige Adressen mehr für getpwnam vorliegen.
|
Könnte mir das wer genauer erklären? Es steht drüber leider sonst nix mehr
Danke im Voraus, mfg michael --
|