Выполнить консольную команду

Модератор: Модераторы разделов

Аватара пользователя
xoguar
Сообщения: 45

Выполнить консольную команду

Сообщение xoguar »

Как программно выполнить консольную команду?
В моем случае мне нужно выключить комп программой.

Я почему-то подумал что будет правильно отправить сигнал на выключение ПК прямо из программы.
Но как это сделать?
Спасибо сказали:
MiK13
Сообщения: 1292
ОС: Linux Debian

Re: Выполнить консольную команду

Сообщение MiK13 »

А system("halt"); не проходит?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Выполнить консольную команду

Сообщение RasenHerz »

Код: Выделить всё

#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: Выполнить консольную команду

Сообщение Portnov »

Ну а конкретную задачу - выключение компа - можно решить системным вызовом reboot. man 2 reboot.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

Re: Выполнить консольную команду

Сообщение strangeman »

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: Выполнить консольную команду

Сообщение drBatty »

strangeman писал(а):
23.12.2008 02:23
А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.

Код: Выделить всё

system("ls -la>test.txt");

после чего, в текстовом файле "test.txt" будет почти весь вывод команды, кроме ошибок конечно...
ошибки ловить по коду возврата system(), а сообщения о них

Код: Выделить всё

system("cp xxx 2>err.txt");

вот так вот.

RasenHerz писал(а):
04.12.2008 18:32
еще можно воспользоваться связкой fork() + exec()
имхо слишком сложно
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

Re: Выполнить консольную команду

Сообщение strangeman »

drBatty писал(а):
23.12.2008 06:58
strangeman писал(а):
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: Выполнить консольную команду

Сообщение drBatty »

strangeman писал(а):
23.12.2008 07:02
Но не хотелось бы сначала перекидывать вывод в файл, потом читать его из файла...

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


потоков всего 4:
  • stdin
  • stdout
  • stderr
  • stdlog
это теория, на практике я так делал, но деталей не помню...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
awel
Сообщения: 16
ОС: Debian sid/experimental

Re: Выполнить консольную команду

Сообщение awel »

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: Выполнить консольную команду

Сообщение strangeman »

awel писал(а):
23.12.2008 08:39
strangeman писал(а):
23.12.2008 02:23
А если консольная команда имеет какой-то вывод, то как его можно записать, например, в строковую переменную? Опять же, применительно к вышеуказанному примеру.


Использовать, к примеру, popen


Спасибо, popen - это как раз то что надо.
Спасибо сказали: