Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Помогите с демоном на С++  (Прочитано 1194 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Windenys

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Помогите с демоном на С++
« : 20 Августа 2013, 20:33:17 »
Недавно начал изучать C++ и хочу написать демона на С++ который будет оповещать об отключении/подключении зарядного устройства.

На Bash я это делал так:

Код: (bash) [Выделить]
if on_ac_power; then

notify-send "POWER = AC" "" -i battery;

else

notify-send "POWER = BT" "" -i battery;

fi

Как узнать статус питания в C++ ?
Как вывести сообщение с уведомлением?
« Последнее редактирование: 21 Августа 2013, 01:11:54 от Windenys »
| Hewlett-Packard m6 | Intel/ATI | Ubuntu 13.04 |

Оффлайн Kernel ops

  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #1 : 20 Августа 2013, 22:12:50 »
ls /sys/class/power_supply/BAT0
cat /sys/class/power_supply/BAT0/*
в студию
еще костыль с notify-send:
Код: (C) [Выделить]
#include <stdlib.h>

int main()
{
system("notify-send message");

return 0;
}
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Windenys

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #2 : 21 Августа 2013, 00:52:28 »
C notify-send разобрался!

Код: (C++) [Выделить]
system("notify-send \"POWER = AC\" \"\" -i battery");
ls /sys/class/power_supply/BAT1

alarm     current_now   power technology
capacity     cycle_count   present type
charge_full     device   serial_number  uevent
charge_full_design  manufacturer  status voltage_min_design
charge_now     model_name   subsystem voltage_now

cat /sys/class/power_supply/BAT1/*

windenys@WINDENYS-PC:~$ cat /sys/class/power_supply/BAT1/*
0
100
4855000
4855000
4855000
270000
0
cat: /sys/class/power_supply/BAT1/device: Это каталог
13-42
MO06062
cat: /sys/class/power_supply/BAT1/power: Это каталог
1
26768 05/31/2012
Discharging
cat: /sys/class/power_supply/BAT1/subsystem: Это каталог
Unknown
Battery
POWER_SUPPLY_NAME=BAT1
POWER_SUPPLY_STATUS=Discharging
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Unknown
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=11100000
POWER_SUPPLY_VOLTAGE_NOW=12887000
POWER_SUPPLY_CURRENT_NOW=270000
POWER_SUPPLY_CHARGE_FULL_DESIGN=4855000
POWER_SUPPLY_CHARGE_FULL=4855000
POWER_SUPPLY_CHARGE_NOW=4855000
POWER_SUPPLY_CAPACITY=100
POWER_SUPPLY_MODEL_NAME=MO06062
POWER_SUPPLY_MANUFACTURER=13-42
POWER_SUPPLY_SERIAL_NUMBER=26768 05/31/2012
11100000
12887000
« Последнее редактирование: 21 Августа 2013, 01:06:03 от Windenys »
| Hewlett-Packard m6 | Intel/ATI | Ubuntu 13.04 |

Оффлайн Kernel ops

  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #3 : 21 Августа 2013, 01:45:02 »
в /sys/class/power_supply/BAT1/status - заряжается или нет. проверку можно выполнить через for(;;) {} и sleep(). что еще непонятно?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #4 : 21 Августа 2013, 02:29:45 »
Windenys, Kernel ops, это не плюсы у Вас, а обёртка над BASH получается. Не ТРУЪ.

Оффлайн Kernel ops

  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #5 : 21 Августа 2013, 02:46:03 »
peregrine,
ждем вашего кода
Windenys,
быстро смастерил пример:
Код: (C++) [Выделить]
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

const int size=20;
const char path[]="/home/shkiper/status";
const char chargingIsTrue[]="Charging";

bool isCharging() {
char *status;
status=new char [size];
ifstream file;
file.open(path);
while(file >> status);
file.close();
if(!strcmp(status, chargingIsTrue)) {
delete [] status;
return true;
}
else {
delete [] status;
return false;
}
}

void printStatus(bool nowStatus) {
if(nowStatus) system("notify-send \"Battery is charging!\"");
else system("notify-send \"Battery is discharging!\"");
}

int main() {
bool lastStatus=isCharging();
bool nowStatus;

printStatus(lastStatus);
for(;;) {
nowStatus=isCharging();

if(lastStatus!=nowStatus) {
printStatus(nowStatus);

lastStatus=nowStatus;
}

sleep(5);
}

return 0;
}
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Windenys

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #6 : 21 Августа 2013, 13:05:47 »
Windenys, Kernel ops, это не плюсы у Вас, а обёртка над BASH получается. Не ТРУЪ.

Предложите ваш вариант проверки статуса питания!
| Hewlett-Packard m6 | Intel/ATI | Ubuntu 13.04 |

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #7 : 21 Августа 2013, 14:32:24 »
Поглядел с notify-send только через system можно работать, Kernel ops почти правильно написал, только один момент мне не нравится, то что директория пользователя не определяется сама, например через getenv("HOME"), как-то так, думаю можно и улучшить код
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>
 
using namespace std;
 
const int size=20;
const char chargingIsTrue[]="Charging";
string Path = getenv("HOME") + string("/status");
bool isCharging() {
        char *status;
        status=new char [size];
        ifstream file;
        file.open(Path.c_str());
        while(file >> status);
        file.close();
        if(!strcmp(status, chargingIsTrue)) {
                delete [] status;
                return true;
        }
        else {
                delete [] status;
                return false;
        }
}
 
void printStatus(bool nowStatus) {
        if(nowStatus) system("notify-send \"Battery is charging!\"");
        else system("notify-send \"Battery is discharging!\"");
}
 
int main() {
        bool lastStatus=isCharging();
        bool nowStatus;
       
        printStatus(lastStatus);
        for(;;) {
                nowStatus=isCharging();
               
                if(lastStatus!=nowStatus) {
                        printStatus(nowStatus);
                       
                        lastStatus=nowStatus;
                }
       
                sleep(5);
        }
               
        return 0;
}

А вообще надо на классы переписать, а то на СИ очень смахивает.  ;)

Оффлайн Windenys

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #8 : 21 Августа 2013, 15:04:56 »
Поглядел с notify-send только через system можно работать, Kernel ops почти правильно написал, только один момент мне не нравится, то что директория пользователя не определяется сама, например через getenv("HOME"), как-то так, думаю можно и улучшить код
Код: (cpp) [Выделить]
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdlib.h>
#include <unistd.h>
 
using namespace std;
 
const int size=20;
const char chargingIsTrue[]="Charging";
string Path = getenv("HOME") + string("/status");
bool isCharging() {
        char *status;
        status=new char [size];
        ifstream file;
        file.open(Path.c_str());
        while(file >> status);
        file.close();
        if(!strcmp(status, chargingIsTrue)) {
                delete [] status;
                return true;
        }
        else {
                delete [] status;
                return false;
        }
}
 
void printStatus(bool nowStatus) {
        if(nowStatus) system("notify-send \"Battery is charging!\"");
        else system("notify-send \"Battery is discharging!\"");
}
 
int main() {
        bool lastStatus=isCharging();
        bool nowStatus;
       
        printStatus(lastStatus);
        for(;;) {
                nowStatus=isCharging();
               
                if(lastStatus!=nowStatus) {
                        printStatus(nowStatus);
                       
                        lastStatus=nowStatus;
                }
       
                sleep(5);
        }
               
        return 0;
}

А вообще надо на классы переписать, а то на СИ очень смахивает.  ;)

Этот скрипт не работает!

При запуске выдает сообщение о разрядке и больше ни на что не реагирует!

Что находится по пути:

home/*/status
| Hewlett-Packard m6 | Intel/ATI | Ubuntu 13.04 |

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #9 : 21 Августа 2013, 15:12:43 »
Windenys, а у Kernel ops работал? Просто у меня не ноут и тестить не чем.

Пользователь решил продолжить мысль 21 Августа 2013, 15:15:00:
cat /sys/class/power_supply/BAT1/status
« Последнее редактирование: 21 Августа 2013, 15:15:00 от peregrine »

Оффлайн Windenys

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #10 : 21 Августа 2013, 15:20:12 »
Windenys, а у Kernel ops работал? Просто у меня не ноут и тестить не чем.

Пользователь решил продолжить мысль 21 Августа 2013, 15:15:00:
cat /sys/class/power_supply/BAT1/status

У Kernel ops тоже неработает!

Так как, по пути:

/home/*/status
Ничего нет!
| Hewlett-Packard m6 | Intel/ATI | Ubuntu 13.04 |

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #11 : 21 Августа 2013, 15:52:34 »
Windenys, вывод команды напиши. Тебе для примера показали, ты же сам хотел разрабатывать.

Оффлайн Kernel ops

  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #12 : 21 Августа 2013, 16:37:36 »
Windenys,
у меня десктоп и /proc/../status нет
это для кого?
Код: (C) [Выделить]
const int size=20;
const char path[]="/home/shkiper/status"; // Меняйте на ваш путь!
const char chargingIsTrue[]="Charging";
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #13 : 21 Августа 2013, 16:49:26 »
peregrine,
#include <libnotify/notify.h>Вам в помощь...
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Помогите с демоном на С++
« Ответ #14 : 21 Августа 2013, 16:57:09 »
Чистый, спасибо.  :D

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.