GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ein C-Programm Benutzereingaben abfragen und gleichzeitig andere Aktionen in einer Linux-Umgebung ausführen?

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/


Linux
  1. Wie vielen Unix-Gruppen kann ein Benutzer angehören?

  2. Wie kann ich den $PATH unter Linux bearbeiten?

  3. Wie kann man feststellen, ob eine Binärdatei sicher ist, um einem nicht vertrauenswürdigen Benutzer sudo-Berechtigungen zu erteilen?

  4. Wie kann ich die Standardgruppe eines Benutzers in Linux ändern?

  5. Wie kann ich unter Linux einen Benutzernamen anhand der ID suchen?

So aktivieren Sie passwortloses Sudo für Benutzer in Linux

So ändern Sie den Benutzer unter Linux

Wie deaktiviere ich die SSH-Anmeldung für den Root-Benutzer in Linux?

Wie kann ich Codeabdeckung für Swift-Pakete unter Linux oder OS X generieren?

Wie kann ich einem Benutzer unter Linux ein Anfangs-/Standardkennwort zuweisen?

Linux - Wie kann ich sehen, was auf Festplatten-E/A wartet