В этом посте описана реализация функции Windows, которая запускает дочерний процесс, создает каналы к stdin
и stdout
, из которых отправляется команда, и возвращается ответ. Наконец, как только все ответы получены, дочерний процесс завершается. Если это звучит знакомо, то в принципе это похоже на функцию Linux popen () , за исключением того, что эта реализация была специально создана для захвата ответа в буфер любой команды, которая возвращает один. (Также включен вариант для использования, когда не требуется или не требуется никакого ответа.)
Полный источник может быть адаптирован для использования в автономном исполняемом файле или в качестве API. (.dll) В любом случае, полученные функции принимают и обрабатывают любую команду, используя стандартный синтаксис Windows CMD. Функция cmd_rsp(...)
возвращает ответ Windows через stdout
в буфер для определения собственного размера.
Экспортированные прототипы:
int __declspec(dllexport) cmd_rsp(const char *command, char **chunk, unsigned int size);
int __declspec(dllexport) cmd_no_rsp(const char *command);
Простой вариант использования при получении ответа:
#include "cmd_rsp.h"
int main(void)
{
char *buf = {0};
buf = calloc(100, 1);//initialize to some initial size
if(!buf)return 0;
cmd_rsp("dir /s", &buf, 100);//buffer will grow to accommodate response as needed.
printf("%s", buf);
free(buf);
return 0;
}
Простой вариант использования, когда ответ не требуется:
#include "cmd_rsp.h"
int main(void)
{
cmd_no_rsp("cd C:\\dir1\\dir2");
return 0;
}
Подробное описание назначения и использования описано в ссылке, приведенной выше. Для иллюстрации приведем несколько примеров ввода команд, каждый из которых в этом случае меняет рабочий каталог, затем выполняет команду из этого каталога:
Команда, чтобы перейти в каталог sqlite
, а затем выполнить запрос:
cd c:\\tempExtract\\sqlite\\Tools\\sqlite-tools-win32-x86-3250300 && sqlite3.exe .\\extract.db \"select * from event, eventdata where eventType=38 and eventdata .eventid=event.eventid\
Команда для перехода в каталог teraterm, затем выполнить скрипт:
"c:\\Program Files (x86)\\teraterm\" && ttpmacro c:\\DevPhys\\LPCR_2\\play\\Play.ttl
Команда для изменения каталога, а затем выполнить команду для отправки нескольких настроек канала цифрового сбора.
cd C:\\Dir1\\Dir2\\Dir3\\support\\Exes\\WriteDigChannel && .\\WriteDigChannel.exe P1_CH0 1 && .\\WriteDigChannel.exe P1_C H0 0 && .\\WriteDigChannel.exe P1_CH0 1
Рекурсивный поиск в каталоге из указанного местоположения:
cd C:\\dir1\\dir2 && dir /s /b