Avatar billede krukken Juniormester
12. november 2004 - 09:40 Der er 10 kommentarer og
1 løsning

Hvordan bruger man sigaction sammen med klasser?

Hvordan bruger man dette når kan opbygget med klasser:
The following C code illustrates how to use the SIGINT and SIGQUIT signals to shutdown a UNIX application process when a user types control-C or control-\, respectively. Much of the error handling logic has been omitted to save space and reduce unnecessary details.

/* Global variables that control
  process shutdown. */
sig_atomic_t graceful_quit = 0;
sig_atomic_t abortive_quit = 0;

/* Signal handler for SIGINT. */
void SIGINT_handler (int signum)
{
  assert (signum == SIGINT);
  graceful_quit = 1;
}

/* Signal handler for SIGQUIT. */
void SIGQUIT_handler (int signum)
{
  assert (signum == SIGQUIT);
  abortive_quit = 1;
}

/* ... */

int main (void)
{
  struct sigaction sa;
  sigemptyset (&sa.sa_mask);
  sa.sa_flags = 0;

  /* Register the handler for SIGINT. */
  sa.sa_handler = SIGINT_handler;
  sigaction (SIGINT, &sa, 0);

  /* Register the handler for SIGQUIT. */
  sa.sa_handler =  SIGQUIT_handler;
  sigaction (SIGQUIT, &sa, 0);

  /* Run the main event loop. */
  while (graceful_quit == 0
        && abortive_quit == 0)
    do_work ();

  if (abortive_quit == 1) {
    _exit (1);
  }
  else if graceful_quit {
    clean_up ();
    exit (0);
  }

  /* NOTREACHED */
}



Det er reelt dette som er problemet: sa.sa_handler = SIGQUIT_handler;

Hvis SIGQUIT_handler-funktionen er en medlemsfunktion får man en compiler fejl.
Avatar billede arne_v Ekspert
12. november 2004 - 10:00 #1
Man kan ikke kalde med en ikke static metode som argument kun med static
metoder og C style functions.


En ikke static metode kræver jo et objekt.

Men er det et problem at lave din handler som static eller C style ?
Avatar billede krukken Juniormester
12. november 2004 - 10:04 #2
Det som er problemet et at få den registret med sa.sa_handler = SIGQUIT_handler;

Hvordan gør man det i .h og i cpp filen?
Avatar billede arne_v Ekspert
12. november 2004 - 10:19 #3
Virker det ikke "as is" hvis du assigner en static metode ?
Avatar billede krukken Juniormester
12. november 2004 - 10:22 #4
Nej, jeg synes ikke jeg kan få det til at virke. Hvordan ville du gøre det?
Avatar billede arne_v Ekspert
12. november 2004 - 10:27 #5
Hvis:

sa.sa_handler = en_funktion;

virker i C så bør:

sa.sa_handler = DinKlasse::EnStaticMetode;

virke i C++.
Avatar billede krukken Juniormester
12. november 2004 - 10:30 #6
Okay.

Men hvordan erklærer du den statiske klasse? Altså både i .h-filen og .cpp filen?
Avatar billede arne_v Ekspert
12. november 2004 - 10:35 #7
Ikke en static klasse en static metode.

class DinKlasse
{
  public:
      void EnIkkeStaticMetode();
      static void EnStaticMetode();
};

void DinKlasse::EnIkkeStaticMetode()
{
}

void DinKlasse::EnStaticMetode()
{
}

husk at en static metode ikke kan bruge instans variable.
Avatar billede krukken Juniormester
12. november 2004 - 13:23 #8
Du må gerne ligge et svar
Avatar billede arne_v Ekspert
12. november 2004 - 13:29 #9
Fik du det til at virke ?

Jeg har tit i lignende situationer brugt:

- en global variabel som indeholdet et objekt af min klasse
- en C funktion som kaldet en metode på objektet
- sat den globale variabel til mit objekt og kaldt med C funktionen som argument

og et svar
Avatar billede krukken Juniormester
12. november 2004 - 13:33 #10
Ja - det virker faktisk rigtig fint - men jeg har tilgengæld nogle andre problemer nu. Nemlig med læsningen på COM-porten. Jeg ved ikke om det er noget i relation til dette?

Men jeg har oprettet et nyt spørgsmål:-)
Avatar billede arne_v Ekspert
12. november 2004 - 15:04 #11
Jge har set det.

Men det ligger vist desværre uden for mit ekspertise område.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester