Ich versuche, einen C-Code (läuft auf einem Ubuntu Linux OS) zu schreiben, die von stdin kontinuierlich liest und jedes Mal variierende Länge von Bytes empfängt. Er muss in 15 Byte langen Arrays an stdout zurücksenden, wenn der Empfangspuffer jedes Mal 15 erreicht oder überschreitet.lesen() für das Lesen von Stream von Stdin
Draft-Code
#include <stdio.h>
#include <unistd.h>
int main()
{
char buff[100];
// Round 1
read(STDIN_FILENO, buff, 15);
printf("Part 1:%s", buff);
// Round 2
read(STDIN_FILENO, buff, 15);
printf("Part 2:%s", buff);
return 0;
}
Um ein Beispiel mit einem Szenario zu geben. Wir erhalten 30 Bytes, in 3 Batches und 10 Bytes für jedes Mal. Ich habe 3 Echobefehle verwendet, um dies im nachstehenden Beispielszenario darzustellen.
Außerdem werden die erwartete Ausgabe und die tatsächliche Ausgabe des aktuellen Entwurfscodes hinzugefügt. Irgendein Kommentar oder Vorschlag, um die erwartete Ausgabe zu haben (vielleicht eine andere Funktion als Lesen und Drucken?), Würde geschätzt werden.
Szenario
Terminal 1:
mkfifo /tmp/MyPipe
tail -f /tmp/MyPipe | ./StreamProcess
Terminal 2:
echo -ne '1234567890' >> /tmp/MyPipe
echo -ne 'abcdefghij' >> /tmp/MyPipe
echo -ne 'qwertyuiop' >> /tmp/MyPipe
Erwartete Ausgabe auf Terminal 1
Nach dem 1. Echo: Nichts g ist
gedrucktnach 2.em Echo:
Part 1:1234567890abcde
Nach 3.em Echo:
Part 1:1234567890abcdePart 2:fghijqwertyuiop
Stromausgang (mit Entwurf-Code) auf Terminal 1
Nach dem 1. Echo: Nichts wird gedruckt
Nach dem 2. Echo:
Part 1:1234567890s· s·Part 2:abcdefghijs· s·
nach dem 3. Echo: (nur die $ prompt gedruckt wird)
Part 1:1234567890s· s·Part 2:abcdefghijs· s·$
Dies ist vom Betriebssystem (Sie wahrscheinlich verwenden POSIX oder Linux) zu überprüfen. Lies über [poll (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) und bearbeite deine Frage, um sie zu verbessern (zumindest indem du mitteilst, welches Betriebssystem du gerade programmierst) –
1) 'char buff [100];' buff wird nicht initialisiert 2) 'read (STDIN_FILENO, buff, 15);' read gibt einen Wert zurück. Benutze es! 3) 'printf (" Teil 1:% s ", buff);' buff ist nicht notwendigerweise nullterminiert. Außerdem: füge ein '\ n' zur Formatzeichenfolge hinzu. ' – wildplasser
@wildplasser Wird der Puffer nicht vorinitialisiert, es sei denn, er befindet sich im globalen Gültigkeitsbereich? Ich verstehe, dass Null-Terminatoren platziert werden müssen, aber der Puffer muss nicht auf Null gesetzt werden. – synchronizer