Я пишу программу на c с именем: «shell» (я имитирую оболочку), и я хочу написать несколько тестов, чтобы убедиться, что я следую всем тестовым примерам, поэтому я попытался использовать #include <assert.h>
но я не понимаю, как имитировать пользовательский ввод в терминале. Я попытался использовать файл, содержащий текст, и изменить stdin
в этот входной файл, а также перенаправить stdout
в выходной файл, но это не сработало.
Я также пытался вставить ввод в терминал с помощью функции system()
, но это тоже не сработало.
пример того, как работает программа оболочки
Итак, shell.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
char buf[1024];
while (1)
{
fgets(buf, 1024, stdin);
if (strncmp(buf, "quit", 4) == 0)
{
exit(0);
}
int fildes[2];
pipe(fildes);
if (fork() == 0)
{
close(fildes[0]);
dup2(fildes[1], STDOUT_FILENO);
execlp("ls", "ls", "-l", NULL);
perror("exec error");
exit(1);
}
else
{
close(fildes[1]);
read(fildes[0], buf, 1024);
printf("%s", buf);
}
}
return 0;
}
поэтому просто скопируйте и вставьте его в файл c и скомпилируйте его или используйте этот онлайн-компилятор, который я нашел, чтобы лучше увидеть функциональность
https://onlinegdb.com/StEq1lNEI
и это моя тестовая программа Итак, test.c
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
// change the output of ls -l to a file
freopen("input.txt", "r", stdin); //redirects standard input
freopen("output.txt", "w", stdout); //redirects standard output
// run the program ./shell
system("./shell");
// insert to the program the command ls -l
system("ls -l");
// read the output from the file output.txt into a buffer of size 1024
char buf[1024];
FILE *fp = fopen("output.txt", "r");
fread(buf, 1024, 1, fp);
fclose(fp);
// compare the output of the program with the output of ls -l
// if they are the same, the test passes
// now how do i test the output of the program?
assert(strcmp("shell.c \n shell",
buf) == 0);
return 0;
}
если вы видите, почему это не работает, пожалуйста, дайте мне знать :) буду очень признателен!
Пожалуйста, предложите редактирование, и я обновлю, конечно, я не против улучшить вопрос
"это не сработало" Пожалуйста, уточните. Что именно не сработало? Покажите, какой ввод приводит к нежелательному результату и что вы хотели бы получить вместо этого.
но я не понимаю, как имитировать пользовательский ввод в терминале.
Есть несколько способов сделать это:
myshell ./myscript
.myshell < ./myscript
. Это собственная оболочка (например) bash
, которая выполняет перенаправление ввода для вашей оболочки.source
./dev/pts/*
, /dev/ptmx
См.: man 7 pty
expect
.
Не могли бы вы улучшить заголовок? Упоминание чего-то о «пользовательском вводе» (например, адрес существующего ответа) облегчит поиск вашего вопроса на этом сайте.