Ich schreibe eine Anwendung, die zuerst Daten von einer Unix-Pipeline empfängt und dann den Benutzer zur Eingabe auffordert. Was ich nicht herausfinden kann, ist, warum die Eingabe aus der Pipeline nicht richtig zu schließen scheint, bevor der Benutzer zur Eingabe aufgefordert wird. Es fühlt sich an, als würde ich hier etwas sehr Elementares vermissen.C - Stdin, Unix-Pipeline und EOF
Ich habe alle Beispiele für Spülen stdin präsentiert here ohne Erfolg versucht. This scheint auch potenziell relevant, aber ich habe es nicht geschafft, relevante Antworten zu extrahieren.
#include <stdio.h>
#include <stdlib.h>
#define BUFSZ 1024
int main(void) {
char *buf = calloc(BUFSZ, sizeof(char));
while(fgets(buf, BUFSZ, stdin)) { printf("Pipe input: %s", buf); }
printf("Enter input: ");
fgets(buf, BUFSZ, stdin);
printf("User input: %s", buf);
free(buf);
return 0;
}
Beispiel der Verwendung und Ausgabe:
$ cat testdata2 | ./a.out
Pipe input: testdata testdata
Pipe input: testdata testdata2
Pipe input: testdata testdata3
Pipe input: testdata testdata4
Pipe input: testdata testdata5
Pipe input: testdata testdata6
Pipe input: testdata testdata7
Enter input: User input: testdata testdata7
$
Wie kann es sein, dass die zweite fgets() (für die Tastatureingabe bestimmt) nie den Puffer berührt?
Dieser MCVE wurde unter OSX und Linux mit identischen Ergebnissen kompiliert getestet.
sollten Sie 'calloc()' BUFSZ + 1 so haben Sie Platz für die '\ 0 ', wenn Sie jemals lange genug in einer Zeile gelesen, um diesen Puffer zu füllen. –
Ihr Problem ist nicht, dass 'stdin' nicht geschlossen wird (es tut, weil' fgets' 'NULL' zurückgibt), sondern dass es nicht wieder für Benutzereingaben geöffnet wird. – Kninnug
@ChrisTurner 'fgets' ermöglicht das: Sie sagen es nur die tatsächliche Puffergröße. –