Как программно выполнить консольную команду?
В моем случае мне нужно выключить комп программой.
Я почему-то подумал что будет правильно отправить сигнал на выключение ПК прямо из программы.
Но как это сделать?
Выполнить консольную команду
Модератор: Модераторы разделов
-
MiK13
- Сообщения: 1292
- ОС: Linux Debian
Re: Выполнить консольную команду
А system("halt"); не проходит?
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Выполнить консольную команду
Код: Выделить всё
#include <linux/unistd.h>
int main(int argc, char *argv[]){
system("shutdown -h -t 10 now");
return 0;
}еще можно воспользоваться связкой fork() + exec()
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Выполнить консольную команду
Ну а конкретную задачу - выключение компа - можно решить системным вызовом reboot. man 2 reboot.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
strangeman
- Сообщения: 160
- Статус: заблудившийся биоробот
- ОС: Ubuntu 12.04, Debian 6
Re: Выполнить консольную команду
RasenHerz писал(а): ↑04.12.2008 18:32Код: Выделить всё
#include <linux/unistd.h> int main(int argc, char *argv[]){ system("shutdown -h -t 10 now"); return 0; }
еще можно воспользоваться связкой fork() + exec()
А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Выполнить консольную команду
strangeman писал(а): ↑23.12.2008 02:23А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.
Код: Выделить всё
system("ls -la>test.txt");после чего, в текстовом файле "test.txt" будет почти весь вывод команды, кроме ошибок конечно...
ошибки ловить по коду возврата system(), а сообщения о них
Код: Выделить всё
system("cp xxx 2>err.txt");вот так вот.
имхо слишком сложно
-
strangeman
- Сообщения: 160
- Статус: заблудившийся биоробот
- ОС: Ubuntu 12.04, Debian 6
Re: Выполнить консольную команду
drBatty писал(а): ↑23.12.2008 06:58strangeman писал(а): ↑23.12.2008 02:23А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.
Код: Выделить всё
system("ls -la>test.txt");
после чего, в текстовом файле "test.txt" будет почти весь вывод команды, кроме ошибок конечно...
ошибки ловить по коду возврата system(), а сообщения о них
Код: Выделить всё
system("cp xxx 2>err.txt");
вот так вот.
Это-то понятно. Но не хотелось бы сначала перекидывать вывод в файл, потом читать его из файла...
А напрямую, без сохранения в файл, эти данные никак не перекинуть? Просто мне нужно вызвать из программы консольную команду, а потом обработать этой же программой ее вывод. Ввиду необходимости гуевого интерфейса, баш для решения этой задачи не подходит...
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Выполнить консольную команду
strangeman писал(а): ↑23.12.2008 07:02Но не хотелось бы сначала перекидывать вывод в файл, потом читать его из файла...
совсем без файлов не получится. потому как вывод команды == запись в файл(точнее поток)
можно
- открыть поток для записи
- подсунуть этот поток команде которая туда что-то запишет
- и прочитать этот поток.
потоков всего 4:
- stdin
- stdout
- stderr
- stdlog
-
awel
- Сообщения: 16
- ОС: Debian sid/experimental
Re: Выполнить консольную команду
strangeman писал(а): ↑23.12.2008 02:23А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.
Использовать, к примеру, popen
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *in;
char s[1024];
// Открываем трубу
if (!(in = popen("ls -l", "r"))) {
return 1;
}
// Читаем вывод команды (здесь построчно)
while (fgets(s, sizeof(s), in)) {
<что-то делаем...>
}
pclose(in);
return 0;
}-
strangeman
- Сообщения: 160
- Статус: заблудившийся биоробот
- ОС: Ubuntu 12.04, Debian 6
Re: Выполнить консольную команду
awel писал(а): ↑23.12.2008 08:39strangeman писал(а): ↑23.12.2008 02:23А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.
Использовать, к примеру, popen
Спасибо, popen - это как раз то что надо.