Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » Nicht-Reentrant-Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.01.2005, 22:36 Uhr
mike
Pinguinhüpfer
(Operator)


Kennt jemand zufällig eine Erklärung für Nicht-Reentrant-Funktion?
Ich steh voll im Wald

thx&mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: