Ihre Aufgabe erfordert eine Ereignisschleife basierend auf select
oder epoll
. Ein Ereignis, auf das es warten würde, ist eine Benutzereingabe - wenn STDIN_FILENO
wird lesefertig. Ein weiterer ist der periodische 1-Sekunden-Timer, wenn Sie den Controller abfragen müssen.
Es gibt einige Bibliotheken, die eine Ereignisschleife für Sie implementieren, sodass Sie sich darauf konzentrieren können, welche Ereignisse Sie wie verarbeiten müssen. libevent
ist eines der ältesten, funktionsreichsten und beliebtesten.
Ich glaube, dass der "Unix"-Weg darin besteht, nicht nach Benutzereingaben zu fragen, sondern auf ein Benutzersignal zu reagieren. Wenn der Benutzer beispielsweise Strg-C drückt, erhält der aktuell ausgeführte Prozess SIGINT.
Ein Beispiel für die richtige Verwendung von SIGINT zum Unterbrechen einer Schleife finden Sie hier. Kopieren Sie es in die Antwort, falls der Link veraltet ist:
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
static volatile sig_atomic_t got_signal = 0;
static void my_sig_handler(int signo)
{
got_signal = 1;
}
int main()
{
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = &my_sig_handler;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return EXIT_FAILURE;
}
for (;;) {
if (got_signal) {
got_signal = 0;
printf("Received interrupt signal!\n");
}
printf("Doing useful stuff...\n");
sleep(1); /* Sleep is not only useful, it is essential! */
}
return EXIT_SUCCESS;
}
(in Ihrem Fall wäre es eine gute Idee, break;
einzugeben in die if
blockieren oder while(!got_signal)
verwenden )
Die einfache Antwort ist Multithreading, bei dem ein Thread bereitgestellt wird, um auf Benutzereingaben zu warten, während die Schleife fortgesetzt wird. Haben Sie also Folgendes:
char flag = 1;
while (flag) {
// run the loop
// if thing happens deploy the thread which will ask user for input
}
Ich habe schon eine Weile kein Thread mehr gemacht, ich denke, diese Seite wäre besser, als wenn ich versuche, es Ihnen zu erklären:https://randu.org/tutorials/threads/