У меня есть простая программа на C с функцией чтения, и я не понимаю выход.C Читайте в bash: stdin и 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;
}
А вот скриншот результата:
Я побежал эту программу в 2 раза, как показано выше, и напечатал «а» для первой попытки и «aecho привет» для вторая попытка.
Как я пытаюсь объяснить результаты:?.
- Когда
read
называется он видит, что STDIN закрывается и открывается его (с моей точки зрения, почему он должен просто читать его я не знать, почему это открывает его). - Я печатаю «aecho hi» в bash и нажимаю enter.
read
имеет приоритет для обработки stdin и считывает первый байт «aecho hi»: «a».- Получаю подтверждение, что
read
обработал 1 байт с помощью printf. - a.out завершено и завершено.
- Как-то остальные данные в stdin обрабатываются в bash (отце моей программы) и идут на stdout, который его выполняет, и по какой-то причине первый байт был удален
read
.
Это все гипотетическое и очень размытое. Любая помощь в понимании того, что происходит, была бы очень желанной.
'stdin' открывается при запуске программы, а не только при вызове' read() '. Остальные ваши объяснения верны. – alk
'stdin' не является« * процессом * », а потоком, как и' stdout'. – alk
«* идет в stdout *». На самом деле, оболочка (bash здесь) перекликается с тем, что она читает через 'stdin', на' stdout', затем выполняет то, что она читает ('echo hi'), и печатает/записывает результат (' hi ') на' stdout'. – alk