Wie funktioniert pause()?

Lesezeit: 3 Minuten

Benutzeravatar von Luis Quesado
Luis Quesado

Ich bin absoluter Noob in c. Ich muss eine Funktion schreiben mypause() das sollte eine ähnliche Funktionalität wie die haben pause() Systemaufruf, und testen Sie die mypause() Funktion in einem Programm, das wiederholt das Warten auf ein Signal blockiert. Wie funktioniert te pause() Funktion geht?? Kann ich nicht einfach ein mypause() so was:

fprintf( stderr, "press any key to continue\n" );

damit das Programm blockiert und auf ein Signal wartet?

Denken Sie daran, dass ich es niemals verwenden kann pause() oder sigpause().

  • Sie wollen also auf einen Tastendruck warten?

    – m0skit0

    13. April 2013 um 20:31 Uhr

  • Klingt wie eine Hausaufgabenfrage. Sollte als solche gekennzeichnet werden? Wie auch immer, ich denke, Sie haben das Problem, das Sie lösen möchten, nicht ganz verstanden. Der pause()-Aufruf wartet NICHT auf Benutzereingaben.

    – Andrew J. Brehm

    13. April 2013 um 20:41 Uhr

  • Dh Tastaturereignisse sind keine Signale im hier geforderten Sinne.

    – Andrew J. Brehm

    13. April 2013 um 20:42 Uhr

  • @AndrewJ.Brehm Mir wurde gesagt, dass das Hausaufgaben-Tag zurückgezogen wurde

    – David

    13. April 2013 um 20:43 Uhr

  • linux.die.net/man/2/pause Pause wartet auf ein Signal (eine Art Kernel-Kommunikation), nicht auf Tastatureingaben. Wie auch immer, fprintf wird das Programm überhaupt nicht anhalten.

    – FrankieTheKneeMan

    13. April 2013 um 20:43 Uhr

Benutzeravatar von Halim Qarroum
Halim Qarroum

Das pause() Funktionsblöcke bis zum Eintreffen eines Signals. Benutzereingaben sind keine Signale. Ein Signal kann von einem anderen Prozess oder dem System selbst ausgegeben werden.

Drücken Ctrl-C z. B. bewirkt, dass Ihre Shell a sendet SIGINT Signal an den aktuell laufenden Prozess, der in normal Fällen führt dazu, dass der Prozess beendet wird.

Um das Verhalten von zu emulieren pause in ISO C99 könnten Sie etwa Folgendes schreiben. Der Code ist kommentiert, wenn Sie eine Frage zu dieser Implementierung haben, fragen Sie bitte.

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

/**
 * The type sig_atomic_t is used in C99 to guarantee
 * that a variable can be accessed/modified in an atomic way
 * in the case an interruption (reception of a signal for example) happens.
 */
static volatile sig_atomic_t done_waiting = 0;

static void     handler()
{
  printf("Signal caught\n");
  done_waiting = 1;
}

void    my_pause()
{
  /**
   *  In ISO C, the signal system call is used
   *  to call a specific handler when a specified
   *  signal is received by the current process.
   *  In POSIX.1, it is encouraged to use the sigaction APIs.
   **/
  signal(SIGINT, handler);
  done_waiting = 0;
  while ( !done_waiting )
    ;
}

int     main()
{
  my_pause();
  printf("Hey ! The first call to my_pause returned !\n");
  my_pause();
  printf("The second call to my_pause returned !\n");
  return (0);
}

Beachten Sie, dass dieses Beispiel nur mit dem funktioniert SIGINT Signal. Um einen zusätzlichen Satz von Signalen zu verarbeiten, können Sie andere Anrufe verwenden signal() mit unterschiedlichen Signalnummern oder Verwendung sigaction() mit einer Maske, die auf alle gewünschten Signale verweist.

Eine vollständige Liste der auf Ihrem System verfügbaren Signale finden Sie in Ihnen <signal.h> enthalten.

  • Beschäftigtes Warten ist schlecht. Legen Sie einen Schlaf in diese Schleife.

    – David

    13. April 2013 um 21:18 Uhr

  • (Schlaf wird früh für Signale aufwachen)

    – David

    13. April 2013 um 21:19 Uhr

  • Danke Halim Qarroum, das ist genau das, was ich brauchte.

    – Luis Quesado

    13. April 2013 um 21:27 Uhr

  • @Dave Sie können aufgrund der klassischen Race-Bedingung nicht einfach sleep verwenden: Wenn der Schlaf zurückkehrt, müssen Sie eine if-Anweisung verwenden, um zu prüfen, ob wir wieder schlafen sollen. Wenn das Signal in diesem Moment ankommt, sind Sie „gestopft“. Genau dafür wurde sigsuspend erfunden. Siehe meinen Kommentar oben: Ein clevererer Signalhandler mit einer Self-Pipe ist die einzige andere (gesunde) Möglichkeit, eine Pause mit einer Schleife wettlauffrei zu implementieren.

    – Nicolas Wilson

    13. April 2013 um 21:30 Uhr

  • @Halim Bleib bei deinen Waffen; deine Antwort ist gut. Busy Wait mag hässlich sein, ist aber technisch korrekt und vielleicht das Beste, was Sie in ISO C tun können, ohne POSIX zu berühren. Der Versuch, etwas Ausgefallenes in einer Schleife zu machen, ist ein klassischer Ort, an dem Programmierer Fehler machen.

    – Nicolas Wilson

    13. April 2013 um 21:38 Uhr

1432300cookie-checkWie funktioniert pause()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy