Почему C stdout не возвращает содержимое команды "ls"? - PullRequest
1 голос
/ 11 апреля 2020

Я работал над обратной оболочкой (не для злонамеренного использования) и начал изучать, как использовать функцию popen и получать вывод с использованием stdout. Я начал тестировать его, и он работал нормально, пока не попробовал использовать команду терминала "ls". Может ли кто-нибудь указать (что я предполагаю) на мою ошибку и показать, как ее исправить?

Вот код для программы C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    while (1){
        char* command = (char *) malloc(15*sizeof(char));
        char* output = (char *) malloc(2048);
        printf(">> ");
        scanf("%s", command);
        FILE* cmd = popen(command, "r");
        fputs(output, stdout);
        pclose(cmd);
        if (strlen(output) != 0){
            printf("\n%s\n", output);
        }
    }
}

и здесь код для ввода, который я предоставил программе, и его результат:

>> cd /Users/
sh: /Users/: is a directory //output from previous command
>> >> ls                    //also why did the program print '>>' twice?
>> 


Другой вопрос: почему программа напечатала >> дважды?

1 Ответ

0 голосов
/ 11 апреля 2020

В коде отсутствует связь между popen() (действительно cmd) и переменной output. Например, вы можете использовать fread() для чтения из cmd "файла" в output.


При вызове scanf("%s", ...) одновременно будет сканироваться только одно слово, разделенное пробелами. Ваша программа сначала запускает cd, затем на следующей итерации она запускает /Users/.


Код теряет память из-за многократного выделения буферов command и output в while l oop без free -ing их.

...