Ich habe ein einfaches C-Programm mit der Lesefunktion und ich verstehe die Ausgabe nicht.C Einlesen in bash: stdin und stdout
//code1.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int main()
{
int r;
char c; // In C, char values are stored in 1 byte
r = read (0, &c, 1);
// DOC:
//ssize_t read (int filedes, void *buffer, size_t size)
//The read function reads up to size bytes from the file with descriptor filedes, storing the results in the buffer.
//The return value is the number of bytes actually read.
// Here:
// filedes is 0, which is stdin from <stdio.h>
// *buffer is &c : address in memory of char c
// size is 1 meaning it will read only 1 byte
printf ("r = %d\n", r);
return 0;
}
Und hier ist ein Screenshot des Ergebnisses:
ich dieses Programm 2-mal lief, wie oben gezeigt, und tippte „a“ für den ersten Versuch und „aecho hallo“ für die zweiter Versuch.
Wie ich versuche, um die Ergebnisse zu erklären:.
- Wenn
read
genannt wird, sorgt dafür, dass stdin geschlossen und öffnet es (aus meiner Sicht, warum Sie sollte es nur lesen ich nicht weiß, warum es es öffnet). - Ich tippe "Aecho Hi" in die Bash und drücke Enter.
read
hat Priorität, stdin zu verarbeiten und liest das erste Byte von "aecho hi": "a".- Ich bekomme die Bestätigung, dass
read
1 Byte mit dem printf verarbeitet hat. - a.out ist beendet und wird beendet.
- Irgendwie werden die restlichen Daten in stdin in bash (dem Vater meines Programms) verarbeitet und gehen zu stdout, die es ausführt, und aus irgendeinem Grund wurde das erste Byte von
read
gelöscht.
Dies ist alles hypothetisch und sehr verschwommen. Jede Hilfe zu verstehen, was passiert ist, wäre sehr willkommen.
'stdin' wird geöffnet, wenn das Programm startet, nicht nur wenn' read() 'aufgerufen wird. Der Rest Ihrer Erklärungen ist korrekt. – alk
'stdin' ist kein" * process * ", sondern ein Stream, wie' stdout' auch. – alk
"* geht zu stdout *" nicht wirklich, die Shell (bash hier) echoet, was sie über 'stdin' nach' stdout' gelesen hat, führt dann aus was sie liest ('echo hi') und druckt/schreibt das Ergebnis (' hi ') zu' stout '. – alk