Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
Приложение в фоне в ВИНДЕ?
 
Вот пишу небольшой ФТП сервер для винды на Перле, так лдя себя. Требуется запустить программу в фоне, то есть запуск проги осуществляется путем прописки в реестр в параметр Run, после перезагрузки вознкаем командное окно, где сервак ждет коннектов.   Это знаете ли как-то напрягает. Как я могу отправить это дело на бэкграунд? В никсах я знаю делается что-то типа system("lala" &), а в винде как? Ведь как-то можно это сделать?
 
могу посоветовать только несколько примеров (правда на английском)
1
2
исходники
полазь посмотри если нет ничего полезного то прости я не спец по пёрлу...
 
спасибо, я вот полазил и нашел решение этой проблемы, привожу текст решения, если кому еще надо:
Как сделать так, чтобы скрипт работал в фоновом режиме, как демон?
Варианта два. Первый - воспользоваться модулем Proc::Daemon, второй - сделать все самому, примерно так:

use strict;
require 'sys/syscall.ph';

# Устанавливаем путь по умолчанию
$ENV{PATH} = '/bin:/usr/bin';

# Чисто для прикола
$0='mydaemon';

# Отделяемся от родителя
fork() && exit;

# Отключаемся от терминала
close STDOUT; close STDERR; close STDIN;

# Делаем корень текужим каталогом
chdir '/';

# Создаем новую сессию и становимся лидером
# группы процессов, чтоб нас случайно не прибили
syscall(&SYS_setsid);

# Перехватываем сигналы, для корректного выхода
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'quit';
$SIG{'HUP'} = 'ignore';

# Делаем наши темные дела
...

# Выходим
quit();

sub quit {
 # Помещаем сюда код для корректного
 # прекращения работы
 ...
 exit(0);
}

Если Вы хотите написать демона, реализующего работу через сеть, рекомендуем ознакомиться с модулем Net::Daemon.

Proc::Background - Общий для Unix и Win32 интерфейс управление фоновыми процессами

Proc::Background - http://search.cpan.org/search?dist=Proc-Background
    Это общий интерфейс для управления фоновыми процессами как на Unix, так и на Win32 платформах. Модуль позволяет Вам запускать и заверщать фоновые процессы, получать выходные данные и отслеживать состояние фоновых процессов.

    P.S. Рекомендую при использовании под Win32 брать архив со CPAN и посмотреть прилагаемые примеры и скрипты.

Вот в общем-то и все :))
 
да всегда пожалуйста...
рад помоч))
 
Не очень понятно, зачем напрягатся если программа пускается из ключа RUN, а не как сервис.

Напиши в ней WinMain(), собери как /subsystem:windows.
После первого вызова системной функции мастдай считает, что WinExec() (ну или CreateProcess() ) завершился успешно и всё ок.

Если вызова не делать, то всё окончится таймаутом..

Вообще нет в мастае такого понятия как background..

А вот перейти в безопасный каталог желательно...

fork() в Windows - это НОНСЕНС!
Делать себя лидером сессии - зачем?
Закрывать stdin, stdout, stderr можно, но безопаснее
связать из с NUL (/dev/null) или куда нужно, например
в error_log.
 
Цитата
Закрывать stdin, stdout, stderr можно, но безопаснее
связать из с NUL (/dev/null) или куда нужно, например
в error_log.
А поподробней не мог ьы рассказать, как это сделать?
Просто перенаправить в dev/null?
 
Цитата
PoizOn пишет:
Цитата
Закрывать stdin, stdout, stderr можно, но безопаснее
связать из с NUL (/dev/null) или куда нужно, например
в error_log.
А поподробней не мог ьы рассказать, как это сделать?
Просто перенаправить в dev/null?

man dup2
 
Ксати, насчет "fork() в Windows - это НОНСЕНС!" Ты не прав версия 5,6 Перла, поддерживает fork и для Винды.
Вот как службу установить приложение, я понял. Но если мне не нужно службы, а просто отрубить окно интерпретатора?
То есть как сделать, чтобы он ничего не светил в это окно - тоже понятно, но как сделать, чтобы этого окна ВООБЩЕ не светилось на мониторе?
 
Цитата
PoizOn пишет:
То есть как сделать, чтобы он ничего не светил в это окно - тоже понятно, но как сделать, чтобы этого окна ВООБЩЕ не светилось на мониторе?

Константы состояния окна при открытии\показе.

SW_HIDE - Прячет окно и переводит в активное состояние другое окно.
SW_MINIMIZE - Минимизирует окно и активизирует окно верхнего уровня в списке менеджера окон.
SW_RESTORE - Действует так же, как и SW_SHOWNORMAL.
SW_SHOW - Активизирует окно и выводит его в текущей позиции и текущего размера.
SW_SHOWDEFAULT - Активизирует окно и выводит его с использованием текущих умолчаний.

SW_SHOWMAXIMIZED - Активизирует окно и выводит его с максимально размером.
SW_SHOWMINIMIZED - Активизирует окно и выводит его в виде пиктограммы.
SW_SHOWMINNOACTIVATE - Выводит окно как пиктограмму; бывшее активныь в данный момент окно остается активным.
SW_SHOWNA - Выводит окно с учетом его состояния в данный момент; активное в данный момент окно остается активным.
SW_SHOWNOACTIVATE - Выводит окно в его прежней позиции и прежнего размера; активное в данный момент окно остаета активным.

SW_SHOWNORMAL - Активизирует окно и выводит его на экран. Если окно было увеличено или уменьшено до пиктограммы, то система Windows восстановит начальное положение и размер окна.
SW_SHOWSMOOTH - Выводит окно так, чтобы оно меньше всего перекрывалось с другими окнами.

если нельзя указать при открытии, то можно послать после запуска ()
The ShowWindow function sets the specified window's show state.

BOOL ShowWindow(

    HWND hWnd,     // handle of window
    int nCmdShow      // show state of window
   );     


Parameters

hWnd

Identifies the window.

nCmdShow

Specifies how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values:
 
Цитата
PoizOn пишет:
Ксати, насчет "fork() в Windows - это НОНСЕНС!" Ты не прав версия 5,6 Перла, поддерживает fork и для Винды.
Вот как службу установить приложение, я понял. Но если мне не нужно службы, а просто отрубить окно интерпретатора?
То есть как сделать, чтобы он ничего не светил в это окно - тоже понятно, но как сделать, чтобы этого окна ВООБЩЕ не светилось на мониторе?

Я не говорю, что этого НЕТ, я говорю, что это НОНСЕНС.
Если тебе нужно скрыть окно perl-интепретатора, который ничего не знает о SW_HIDE то просто пускай его через программульку HIDERUN.EXE
 
10x 2All. Поразбираюсь с этим.
 
Цитата
less пишет:
 
который ничего не знает о SW_HIDE то просто пускай его через программульку HIDERUN.EXE

Ерунда любое окно это знает (в виндах)
SW_HIDE сообщение которое нужно послать окну для его скрытия (можно извне), или изначально установить этот атрибут при создании окна / HIDERUN.EXE может помочь но не всегда/
 
Да с HIDERUN может быть проблемы, мой АНТИВИРЬ ее расценивает как троян.
Вот вопрос, как я уже писал я пишу на Перл, и для того чтобы использовать эти константы SW_HIDE и проч. мне наверное потребуется какой-то модуль? Если знаете, то не подскажете какой?
10х.
 
проще написать маленькую прогу на С или Дельфи
запускающую все что нужно с правилиными атрибутами
----
Пример функции на дельфи:

function ExecuteFile(const FileName, Params, DefaultDir: string;
 ShowCmd: Integer): THandle;
var
 zFileName, zParams, zDir: array[0..79] of Char;
begin
 Result := ShellExecute(Application.MainForm.Handle, nil,
    StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
    StrPCopy(zDir, DefaultDir), ShowCmd);
end;
 
я дельфи не знаю, поэтому мне проще обратиться к модулям перл.
 
Цитата
PoizOn пишет:
я дельфи не знаю, поэтому мне проще обратиться к модулям перл.

А я перл не знаю(ну некогда учить)
но как понимаю из самого перл этого не сделать
нужно поменять атрибуты окна (при запуске приложения, или после - отправить из другой проги сообщение твоему окну, типа спрячся)
 
Но может это как-то связано с Win API? Для Перла есть модули по работе с этим интерфейсом?
 
Цитата
PoizOn пишет:
Но может это как-то связано с Win API? Для Перла есть модули по работе с этим интерфейсом?
Не как-то, это и есть функции из Win API
 
А... тогда понятно, теперь знаю какой модуль можно заюзать для этого.
Страницы: 1
Читают тему