void do_popen()
FILE *pf;
char command[200];
// Execute a process listing
sprintf(command, "netsh interface ip show addresses");
// Setup our pipe for reading and execute our command.
if(!(pf= popen(command, "r"))){
exit(EXIT_FAILURE);
}
if (pclose(pf) != 0)
fprintf(stderr," Error: Failed to close command stream \n");
return;
}
Здесь мы используем POPEN который внутренне создает процесс и запустить команду, данное ему. Он возвращает поток ввода-вывода, откуда данные могут быть получены позже. read
и write
системные вызовы используются при чтении из заданного командного буфера или записи в файл обратно
Чтобы сделать его более общим, вы можете передать команду в параметре функции и вернуть данные, хранящиеся в файле, в динамический массив.
Хотя это делается красиво, используя popen
, но он создает отдельный процесс, в котором он запускает эти команды как команды sh
, а затем помещает их в файл и перед возвратом указателя файла он закрывает весь процесс.
Я предпочел бы реализовать свой собственный дочерний процесс с помощью fork()
, а затем использовать exec
и реализовать собственный SIGCHILD
обработчик, чтобы удалить его из зомби и продолжать обрабатывать другую работу параллельно, а не блокировать процесс
Используйте 'popen()' вместо 'system()'. –
не могли бы вы объяснить, как записать его в файл – Varadharajan
Как уже отмечалось, используйте 'popen' для запуска команды вместо' system'. Затем используйте любую из входных функций, таких как 'fread' и' fgets', чтобы читать из потока файлов, возвращаемого 'popen'. Затем используйте выходные функции, такие как 'write' и' fwrite', чтобы записать данные обратно в файл. – kaylum