Вот кусок кода c, который я написал после тестирования некоторых материалов.Stdin не покраснел после обычной манекен-программы
Я знаю, что это не проблема уязвимости, но я не понимаю, почему stdin не сбрасывается после нормального возврата программы, в тот момент, когда запрос возвращает stdin, stdout, stderr. Я имею в виду, почему оставшиеся символы на stdin перенаправляются на stdout после окончания обычного выполнения программы и не краснеют?
$cat dummy.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(){
char rbuf[100];
if (read(0, rbuf,5) == -1){
perror("learn to count");
printf("errno = %d.\n", errno);
exit(1);
}
//printf("rbuf : %s\n",rbuf);
return 1;
}
Вот исполнение:
$ gcc -o dummy dummy.c
$ ./dummy
AAAAA /bin/sh
$ /bin/sh
sh-3.2$ exit
exit
$
Я думаю, это просто остальные строки из стандартного ввода, напечатанной на сизой стандартный вывод, который является приглашение. Кроме того, линия в конце, она каким-то образом эмулирует ввод, нажатый пользователем для выполнения команды. Что происходит? Мне просто интересно узнать об этом больше.
Спасибо за ваш ответ, но я знаю, что могу рушить вручную. Мой вопрос был не «Могу ли я его рушить вручную и как», но «Почему это не делается ОС или что-то еще после нормального возврата моей программы». Поскольку перенаправление stdin, stdout и stderr должно выполняться, когда приглашение возвращает руку, но все же stdin автоматически не очищается. Так что мне все еще интересно узнать об этом :) – user2075640
Поскольку ОС ожидает, что исполняемые файлы будут потребляться во входном буфере, адресованном исполняемому файлу. Входной буфер - это просто очередь ожидающих потребления данных. Нет информации о том, какой исполняемый файл может и не может использовать эти данные. Таким образом, ОС не может этого сделать –