Erkennen von Ctrl-D in C
Ich versuche zu erkennen, die Strg+D Benutzereingaben, die ich kenne, gibt EOF
. Jetzt weiß ich den code auf eine Eingabe wartet, aus dem stdin-stream, aber gibt es eine Möglichkeit, dass das Programm fortgesetzt, bis die Strg+D - Befehl ist in stdin? Sollte das Programm weiterhin laufen Vergangenheit die if-Anweisung if Strg+D ist nicht eingegeben.
char buffer[];
if (fgets(buffer, 10, stdin) == NULL{
//write to file
}
- Der gepostet code nicht kompilieren.
- Nein, das ist nicht möglich. Ein Programm läuft oder Stoppt und auf Eingaben wartet. Es kann nicht beide Dinge auf einmal. (Bevor jemand sagt, das ist möglich mit multithreading: ich nicht empfehlen Tauchen Sie ein in multithreading nur noch).
- Das fühlt sich für mich wie eine Frage nach einer XY-problem
- Dein buffer-array hat ein Problem - EOF ist kein
char
(Sie benötigen eineint
für die).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wollen Sie verhindern, dass ein Programm, wenn der Benutzer durch drücken von Strg+D? Aber Sie wollen nicht Lesen stdin? Wenn das wahr ist, sollten Sie berücksichtigen, wenn ein handler für Strg+C wäre die bessere Lösung. Aber zuerst Schreibe ich etwas über non-blocking I/O, denn dies ist, was Sie fordern.
Es gibt keine standard-Weg, um zu erreichen, nicht blockierende I/O in C. Aber man könnte POSIX-Funktionen wie
select
oderfcntl
in Kombination mitread
. Es gibt andere Fragen, über die Ihr auf StackOverflow. Diese Frage zum Beispiel.Wenn Sie behandeln möchten, Strg+C verwenden, können Sie
signal
etwas wie das hier tun:Da die Maschine erzeugt
EOF
auf Strg+D sollten Sie prüfenfgets()
fürNULL
alsfgets()
ist zur Rückgabe verpflichtetNULL
auf das Ende der Datei.Ist es zu viel, hier zu posten, und Sie sind nicht spezifisch, was du aktuell hast und was du willst. Also hier gibt Ihnen eine Allgemeine Vorstellung davon, wie es zu tun:
Add-signal-handler in Ihrem Programm
Wenn Sie nur wollen, beenden Sie das Programm, wenn C-d eingegeben wird, senden Sie ein SIGKILL gesendet in Schritt 2, und ignorieren Sie Schritt 3.
Wenn Sie nicht wissen, jeder Begriff, der oben, Google ist dein Freund
Auf den meisten Betriebssystemen, stdin gepuffert ist eine Zeile zu einem Zeitpunkt, und jeder Versuch, es zu Lesen (ohne in die low-level-Gemeinheiten) aufhören wird, bis entweder eine Zeile oder EOF ist verfügbar. Wenn Sie nichts dagegen haben diese, und wollen einfach nur, um zu überprüfen, für die EOF-ohne zu Lesen-auf jeden wartet-Eingang, wenn ein EOF-Zeichen nicht vorhanden ist, könnten Sie mit ungetc:
Sind Sie nur garantiert ein Zeichen von push-back von ungetc, obwohl die meisten Implementierungen geben Sie viel mehr. Und es funktioniert nur, wenn du nicht gehst, um den stream später (das ist der Fall mit stdin). Beachten Sie auch, dass ich ' m nannte es "bytes eingegeben", nicht "Zeichen": die chinesische, japanische und koreanische Zeichen zum Beispiel passt nicht in die char-Typ, der die meisten C-Implementierungen, und es würde davon abhängen, wie die Konsole verschlüsselt Sie, wenn Sie eingeben (wenn Sie einen CJK-Eingabemethoden einrichten oder kann kopiert werden, können Sie versuchen, es auf der oben genannten Programm und sehen).