Я тестирую метод имитации конкретного ввода в приложение. Это приложение:Имитировать вход для STDIN с EOL
#include <stdio.h>
int main()
{
int num1;
char buffer[6] = {0};
scanf("%d", &num1);
read(0, buffer, 6);
printf("num1 = %d\n", num1);
for(num1=0; num1 < 6; num1++)
{
printf("%02X\n", buffer[num1]);
}
return 0;
}
Я пытаюсь имитировать ввод с помощью следующей команды Баша:
echo -ne "1337\\x0A\\x31\\x02\\x03\\x04\\x05\\x06" | ./test
Выхода я получаю следующее:
num1 = 1337
00
00
00
00
00
00
Как вам видно, что буфер не был заполнен значениями, переданными в STDIN.
EDIT: Функция ниже используется только для иллюстрации идеи автоматизации ввода в смешанных входных/выходных функций, я получил эту функцию с помощью обратного проектирования двоичный файл, можно автоматизировать ввод?
Я ценю вашу помощь.
Спасибо,
Спасибо за отличный ответ !. Можем ли мы сказать в качестве вывода, что автоматизировать вход в функцию выше невозможно, потому что scanf будет читать весь буфер stdin? Есть ли у вас какие-либо идеи передавать данные без труб? – Xedar
Он попытается прочитать. Обычно, когда вход поступает с терминального устройства, он получает столько же ввода до символа новой строки (терминал даже переводит ASCII CR в ASCII LF в соответствии с соглашением UNIX). В этом случае является драйвером терминала, который решает объем данных вернуться. Это причина необходимости всегда проверять возвращаемое значение 'read (2)' syscall, потому что вы не всегда получаете столько данных, сколько вы запросили. –