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()
.
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.
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