Модератор: Модераторы разделов
ezheg
Сообщения: 258
Статус: джидай 3-го уровня
ОС: Mac OS X
Сообщение
ezheg » 27.02.2005 16:57
как можно выполнить какую-либо комманду/исполняемый файл на Си?
например выполнить -
и в строковой переменной получить вывод этой комманды
Gloomy
Сообщения: 340
Статус: сочувствующий
Сообщение
Gloomy » 27.02.2005 18:20
Код: Выделить всё
#include <stdlib.h>
system("/usr/sbin/hddtemp /dev/hda");
А получить результат наверное через пайпы.
madskull
Сообщения: 1019
Статус: Экс-металлюга
Сообщение
madskull » 27.02.2005 19:20
Перл надо юзать
Самый простой способ (ИМХО): вывод команды направить в файл, а потом уже файл парсить.
Arch Linux / Ice WM
nercus
Сообщения: 150
Сообщение
nercus » 27.02.2005 21:23
имхо так можно
Код: Выделить всё
#include <stdio.h>
char out[256];
FILE *hddtemp
hddtemp = popen("/usr/bin/hddtemp /dev/hda","r");
fgets(out, 256, hddtemp);
pclose(hddtemp);
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
ezheg
Сообщения: 258
Статус: джидай 3-го уровня
ОС: Mac OS X
Сообщение
ezheg » 01.03.2005 00:17
спасибо всем за ответы. с использованием последнего примера и манов:
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
void write_data (FILE * stream){
int i;
for (i = 0; i < 100; i++)
fprintf (stream, "%d\n", i);
if (ferror (stream))
{
fprintf (stderr, "Output to stream failed.\n");
exit (EXIT_FAILURE);
}
}
main(){
FILE *hddtemp;
hddtemp=popen("/usr/bin/hddtemp /dev/hda","w");
write_data(hddtemp);
}
Код: Выделить всё
bash-2.05b$ ./hdd_temp
bash-2.05b$ ВНИМАНИЕ: Диск /dev/hda не включен в базу данных поддерживаемых приводов.
ВНИМАНИЕ: Но с использованием распространенных параметров он что-то выдает.
ВНИМАНИЕ: Заметьте, что показанная температура может таковой не являться.
ВНИМАНИЕ: См. опции --help, --debug и --drivebase.
ВНИМАНИЕ: И не забудьте, что можно добавить привод в hddtemp.db
/dev/hda: ST360014A: 32°C или °F
еще бы теперь напрячь собственные мозги для извлечения на Си из всего этого циферок с температурой..B)
nercus
Сообщения: 150
Сообщение
nercus » 01.03.2005 00:46
2piton3000
имхо fscanf():
char dev[256];
char hdd[256];
int temp;
fscanf(hddtemp, "%s %s %d", dev, hdd, &temp); /* Input: /dev/hda: ST360014A: 32C */
dev[strlen(dev)-1] = 0; /* remove ':' */
hdd[strlen(hdd)-1] = 0; /* remove ':' */
вот как-то так.
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ