Russian Qt Forum
Май 09, 2024, 00:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Демон на Qt - реально?  (Прочитано 20519 раз)
bvn13
Гость
« : Февраль 05, 2010, 21:26 »

Собственно, сабж. Чего-то я не могу заставить консольное приложение продолжать работать, вернув управление системе... это вознможно реализовать?
Записан
BRE
Гость
« Ответ #1 : Февраль 05, 2010, 21:30 »

А как возвращаешь управление системе?
Записан
bvn13
Гость
« Ответ #2 : Февраль 05, 2010, 21:34 »

если пишу:

Код:
QCoreApplication a(argc, argv);
...
...
return a.exec();

то управление не возвращается, а если просто

Код:
return 0;

то завершается...

вот и думаю... возможно ли не завершить и управление вернуть?
Записан
BRE
Гость
« Ответ #3 : Февраль 05, 2010, 21:38 »

вот и думаю... возможно ли не завершить и управление вернуть?
Возможно.

Гугл знает все, примеров масса.
Поищи, почитай про демонизацию процессов +
man daemon

Есть готовое решение, называется QtService.

Хотя, лично я не понимаю таких зависимостей (как Qt) у демонов.  Подмигивающий
« Последнее редактирование: Февраль 05, 2010, 21:42 от BRE » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Февраль 05, 2010, 23:55 »

Код
C++ (Qt)
void daemonize()
{
   if(QCoreApplication::arguments().contains("--no-daemon"))
       return;
 
   switch (fork())
   {
       case 0:  break;
       case -1: exit(errno);
       default: exit(0);
   }
}
 

Код
C++ (Qt)
int main(int argc, char **argv)
{
   QCoreApplication app(argc, argv);
 
   new MainObject;
 
   daemonize();
 
   return app.exec();
}
 

man fork
Записан
BRE
Гость
« Ответ #5 : Февраль 06, 2010, 09:15 »

man fork
Для чего самому делать fork, если есть функция daemon, которая по-мимо отделения от родителя, делает другие необходимые операции для демонизации?
Записан
Zmeishe
Гость
« Ответ #6 : Февраль 06, 2010, 09:24 »

Цитата: BRE
Для чего самому делать fork, если есть функция daemon
Полностью согласен. Давно всё изобретено и на этом форуме писАлось.
Код:
#include <QtCore/QCoreApplication>

#ifdef Q_OS_LINUX

#include <unistd.h>

#endif

int main(int args, char* argv[])
{
#ifdef Q_OS_LINUX

  daemon(0, 0);

#endif

 QCoreApplication app(args, argv);
...
  return app.exec();
}

Записан
Rcus
Гость
« Ответ #7 : Февраль 06, 2010, 09:38 »

man fork
Для чего самому делать fork, если есть функция daemon, которая по-мимо отделения от родителя, делает другие необходимые операции для демонизации?

Код
C
int
daemon(nochdir, noclose)
int nochdir, noclose;
{
int fd;
 
switch (__fork()) {
case -1:
return (-1);
case 0:
break;
default:
_exit(0);
}
 
if (__setsid() == -1)
return (-1);
 
if (!nochdir)
(void)__chdir("/");
 
if (!noclose) {
struct stat64 st;
 
if ((fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1
   && (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)
== 0)) {
if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
#if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
   && (st.st_rdev
== makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
#endif
   ) {
(void)__dup2(fd, STDIN_FILENO);
(void)__dup2(fd, STDOUT_FILENO);
(void)__dup2(fd, STDERR_FILENO);
if (fd > 2)
(void)__close (fd);
} else {
/* We must set an errno value since no
  function call actually failed.  */

close_not_cancel_no_status (fd);
__set_errno (ENODEV);
return -1;
}
} else {
close_not_cancel_no_status (fd);
return -1;
}
}
return (0);
}
 
И судя по манам fork() это POSIXЪ, а daemon() - изобретение BSD
Записан
BRE
Гость
« Ответ #8 : Февраль 06, 2010, 09:58 »

Ну так fork != daemon.
Если предположить, что где-то не будет daemon, можно реализовать свою функцию daemon (с необходимым функционалом) используя только POSIX-функции. И при конфигурации проекта выбирать что использовать.
Записан
nixman05
Гость
« Ответ #9 : Февраль 06, 2010, 11:54 »

вот и думаю... возможно ли не завершить и управление вернуть?
Возможно.

Гугл знает все, примеров масса.
Поищи, почитай про демонизацию процессов +
man daemon

Есть готовое решение, называется QtService.

Хотя, лично я не понимаю таких зависимостей (как Qt) у демонов.  Подмигивающий


Если необходимо только на Linux/BSD то можно использовать fork/daemon, а если необходима работа еще и под масдаем то лучше использовать QtService т.к. кроссплатформенно.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Февраль 07, 2010, 21:21 »

А не проще ли запускать приложение в *.nix - ах через скрипты? т.е. так как сделано в /etc/rc.d .. тем более проще всего запустить типо так:
Цитировать
# & myapp
(или & в конце.. не помню) Улыбающийся

Про винду - там использовать виндовые апи и т.п.
т.е зачем городить огород ненужного кода?
Записан

ArchLinux x86_64 / Win10 64 bit
crossly
Гость
« Ответ #11 : Февраль 07, 2010, 21:59 »

& всего лишь отсылает процесс в background .... и процесс будет завершен при закрытии родительского шела.... в первую очередь советовал бы ознакомится с самой ОС перед тем как начинать программировать под нее... это относится и к посту о запуске приложения...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #12 : Февраль 09, 2010, 12:02 »

в линупсах как я помню есть команды startproc и startdaemon к-ые и юзаются из скриптов в init.d
Записан
crossly
Гость
« Ответ #13 : Февраль 09, 2010, 12:47 »

это зависит от дистрибутива ... эти команды есть в SUSE.... но их нету к примеру в mandriva или debian/ubuntu...
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #14 : Февраль 09, 2010, 16:34 »

Демон на Qt - реально?
Я бы для начала потренировался на чертях - их имплементация полегче О_о....
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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