C запустите внешнюю программу и получите результат - PullRequest
4 голосов
/ 19 ноября 2010

Как в C выполнить внешнюю программу и получить ее результаты, как если бы она запускалась в консоли?

, если существует исполняемый файл с именем dummy, и при его выполнении в командной строке отображается 4-значный номер в командной строке.Я хочу знать, как запустить этот исполняемый файл и получить 4-значный номер, который он сгенерировал.В к.

Ответы [ 4 ]

4 голосов
/ 19 ноября 2010

popen () справляется с этим довольно хорошо. Например, если вы хотите что-то вызвать и прочитать результаты построчно:

char buffer[140];
FILE *in;
extern FILE *popen();
if(! (in = popen(somecommand, "r"""))){
    exit(1);
 }

 while(fgets(buff, sizeof(buff), in) != NULL){
      //buff is now the output of your command, line by line, do with it what you will
 }
 pclose(in);

Это работало для меня раньше, надеюсь, это полезно. Не забудьте включить stdio, чтобы использовать это.

4 голосов
/ 19 ноября 2010

Это на самом деле не то, что ISO C может делать самостоятельно (я имею в виду, что сам стандарт не предоставляет такую ​​возможность) - возможно, самое портативное решение - это просто запустить программу, перенаправивего стандартный вывод в файл, например:

system ("myprog >myprog.out");

, затем используйте стандартный ISO C fopen/fread/fclose для чтения этого вывода в переменную.

Это не обязательно лучший решение, поскольку это может зависеть от базовой среды (и даже возможность перенаправления вывода зависит от платформы), но я подумал, что добавлю его для полноты.

4 голосов
/ 19 ноября 2010

Вы можете использовать popen() в UNIX.

3 голосов
/ 19 ноября 2010

В Unix есть popen(), как упоминалось ранее, что дает вам FILE* для чтения.

В качестве альтернативы в Unix вы можете использовать комбинацию pipe(), fork(), exec(), select() и read() и wait() для выполнения задачи более обобщенным / гибким способом.

Библиотечный вызов popen вызывает fork и pipe под капотом для выполнения своей работы.Используя его, вы ограничены простым чтением того, что процесс выгружает в стандартный вывод (который вы можете использовать для перенаправления базовой оболочки).Используя низкоуровневые функции, вы можете делать практически все, что захотите, включая чтение stderr и запись stdin.

В окнах смотрите вызовы типа CreatePipe() и CreateProcess() с элементами ввода-вывода STARTUPINFOустановить на ваши трубы.Вы можете получить дескриптор файла для read(), используя _open_ofshandle() с дескриптором процесса.В зависимости от приложения может потребоваться чтение многопоточных или блокировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...