Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

погасить процесс

Приветствую!
Подскажите как программно погасить проссес.А потом заново его стартовать.

AKA votum

Номер выпуска : 4194
Возраст листа : 553 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/340515
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 27 Mar 2005 00:31:29 +0700 (#340515)

 

Ответы:

i686-suse-linux)

Hello, <ru***@m*****.ru>!

On Sun, 27 Mar 2005 00:31:29 +0700 you wrote:

Огнетушителем?

(сории, не удержался)

Ответить   "B." Mon, 28 Mar 2005 11:22:41 +0400 (#340546)

 

On Mon, 28 Mar 2005 11:22:41 +0400
"B." <boff20***@m*****.ru> wrote:

boff2003>
boff2003> > Подскажите как программно погасить проссес.
boff2003> Огнетушителем?

Беда в том что огнетушитель не опламбирован и неосвидетельствовам в
установленом законом порядке.
Однако рано терять выдержку.

Номер выпуска : 4196
Возраст листа : 553 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/340552
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 27 Mar 2005 17:32:09 +0800 (#340552)

 

i686-suse-linux)

Hello, <ru***@m*****.ru>!

On Sun, 27 Mar 2005 17:32:09 +0800 you wrote:

А если серьезно, то смотри TerminateProcess и CreateProcess.
Только нужно будет каким-нибудь образом получить Handle процесса (не зна
ю как).

Ответить   "B." Mon, 28 Mar 2005 13:08:57 +0400 (#340560)

 

Здравствуйте, run9.

Вы писали 27 марта 2005 г., 0:31:29:

Остановить
Sendmessage(hendel, wm_close,0,0);

Запустить
uses ShellAPI
....
ShellExecute(application.hendel, Путь, Параметры, Папка, wm_shownormal);

Ответить   Sun, 27 Mar 2005 20:36:12 +0700 (#340652)

 

Приветствую
On Sun, 27 Mar 2005 20:36:12 +0700
janalex <janal***@n*****.ru> wrote:

janalex> Остановить
janalex> Sendmessage(hendel, wm_close,0,0);
janalex>
janalex> Запустить
janalex> uses ShellAPI
janalex> ....
janalex> ShellExecute(application.hendel, Путь, Параметры, Папка, wm_shownormal);

Sendmessage посылает сообщение окну или окнам,а уменя процесс, если
конкртнее мне надо останавливать на время SQL сервера интербейс и
файрберд,которые по умолчанию запущены как процессы.
AKA votum

Номер выпуска : 4199
Возраст листа : 553 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/340718
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sun, 27 Mar 2005 07:54:13 +0800 (#340718)

 

Хаю ду ю ду run9@m*****.ru?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

Может тебе не процесс, а сервис (службу) надо приостановить?
Если так, тогда кури доку:
OpenService + SERVICE_PAUSE_CONTINUE
ControlService + SERVICE_CONTROL_PAUSE

Ответить   Mon, 28 Mar 2005 01:35:25 +0600 (#340753)

 

Здравствуйте !


Подозреваю, чт у этих серверов есть стандартный протокол управления.
Наверняка ведь есть инструменты для администрирования, которыми можно
преостанавливать работу этих серверов (в MS SQL Server по крайней мере
такое есть). Так вот. Эти сервера скорее всего работают как сервисы.
Это значит, что из пользовательского режима к ним подлезть трудно.
Во всяком случае надо сначала смотреть в сторону стандартных средств
управления. Они скорее всего реализованы на TCP протоколе.

Если все таки хочется использовать "грязные" методы, то опять же
придется внедрять свой код в процесс сервера и по очереди тормозить
там все потоки. То есть создать в этом процессе свой поток, который
будет приинмать у тебя команды и по команде нчнет перебирать и суспендить
все потоки процесса кроме себя, конечно же. Потом снова ждать команд.
Потом (когда придет команда), сделает всем потокам ResumeThread.

Только вот не факт, что после длительного простоя после "замораживания"
такими методами, чего нибудь не вылетит (пользователи точно отвалятся
из-за таймаута) - вдруг в этих серверах есть алгоритмы, завязанные
на временные параметры.

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4216
Возраст листа : 555 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/342064
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Tue, 29 Mar 2005 22:50:21 +0400 (#342064)

 

А ось какая?

С ув. Николай.

Номер выпуска : 4201
Возраст листа : 554 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/340812
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Mon, 28 Mar 2005 00:49:01 +0400 (#340812)

 

Приветствую!
On Mon, 28 Mar 2005 00:49:01 +0400
"Nikolay N. Ivanov" <nnivan***@m*****.ru> wrote:

nnivanov> А ось какая?
nnivanov> С ув. Николай.
Эх был бы *nix я бы сначала man kill. Кстати если в linux можно
убить демон по имени,соответственно зная его? Есть еще кое какие
вопросы по никсам- в новом треде.
С уважением Валерий.
AKA votum

Номер выпуска : 4205
Возраст листа : 554 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/341281
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Mon, 28 Mar 2005 05:43:35 +0800 (#341281)

 

run9@m*****.ru пишет:

Да можно. См. исходники killall.

Ответить   Oleg Ponomarev Tue, 29 Mar 2005 12:39:18 +0300 (#341960)

 

В Linux можно все! Если нужно именно убить демон-процесс по имени, то
воспользуйтесь файловой системой /proc, в которой обозначены все
соответствия имен к PID'ам. Но демонов надо не убивать, а грушить, то
бишь останавливать: только в этом случае система будет функционировать
правильно.

С ув. Николай.

Номер выпуска : 4213
Возраст листа : 555 (дней)
Количество подписчиков : 526
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/341961
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Mon, 28 Mar 2005 23:01:14 +0400 (#341961)

 

Вот выдержка из MSDN. Сорри, без перевода, нет времени.

<начало цитаты>

Knowledge Base

HOWTO: Terminate an Application "Cleanly" in Win32PSS ID Number: 178893
Article Last Modified on 1/7/2002

The information in this article applies to:

Microsoft Win32 Application Programming Interface (API), when used with:
the operating system: Microsoft Windows 95
the operating system: Microsoft Windows NT 4.0
the operating system: Microsoft Windows 2000
the operating system: Microsoft Windows XP

This article was previously published under Q178893
SUMMARY
In a perfect world, your process could ask another process, through some
form of inter-process communication, to shut down. However, if you do not
have source-level control of the application that you wish to shut down,
then you may not have this option. Although there is no guaranteed "clean"
way to shut down an application in Win32, there are steps that you can take
to ensure that the application uses the best method for cleaning up
resources.
MORE INFORMATION
32-Bit Processes (and 16-Bit Processes under Windows 95)
Under Win32, the operating system promises to clean up resources owned by a
process when it shuts down. This does not, however, mean that the process
itself has had the opportunity to do any final flushes of information to
disk, any final communication over a remote connection, nor does it mean
that the process' DLL's will have the opportunity to execute their
PROCESS_DETACH code. This is why it is generally preferable to avoid
terminating an application under Windows 95 and Windows NT.

If you absolutely must shut down a process, follow these steps:
Post a WM_CLOSE to all Top-Level windows owned by the process that you want
to shut down. Many Windows applications respond to this message by shutting
down.

NOTE: A console application's response to WM_CLOSE depends on whether or not
it has installed a control handler.

Use EnumWindows() to find the handles to your target windows. In your
callback function, check to see if the windows' process ID matches the
process you want to shut down. You can do this by calling
GetWindowThreadProcessId(). Once you have established a match, use
PostMessage() or SendMessageTimeout() to post the WM_CLOSE message to the
window.
Use WaitForSingleObject() to wait for the handle of the process. Make sure
you wait with a timeout value, because there are many situations in which
the WM_CLOSE will not shut down the application. Remember to make the
timeout long enough (either with WaitForSingleObject(), or with
SendMessageTimeout()) so that a user can respond to any dialog boxes that
were created in response to the WM_CLOSE message.
If the return value is WAIT_OBJECT_0, then the application closed itself
down cleanly. If the return value is WAIT_TIMEOUT, then you must use
TerminateProcess() to shutdown the application.

NOTE: If you are getting3 a return value from WaitForSingleObject() other
then WAIT_OBJECT_0 or WAIT_TIMEOUT, use GetLastError() to determine the
cause.
By following these steps, you give the application the best possible chance
to shutdown cleanly (aside from IPC or user-intervention).
The 16-Bit Issue (under Windows NT)
The preceding steps work for 16-bit applications under Windows 95, however,
Windows NT 16-bit applications work very differently.

Under Windows NT, all 16-bit applications run in a virtual DOS machine
(VDM). This VDM runs as a Win32 process (NTVDM) under Windows NT. The NTVDM
process has a process ID. You can obtain a handle to the process through
OpenProcess(), just like you can with any other Win32 process. Nevertheless,
none of the 16-bit applications running in the VDM have a process ID, and
therefore you cannot get a Process Handle from OpenProcess(). Each 16-bit
application in a VDM has a 16-bit Task Handle and a 32-bit thread of
execution. The handle and thread ID can be found through a call to the
function VDMEnumTaskWOWEx(). For additional information, please see the
following article in the Microsoft Knowledge Base:
175030 HOWTO: Enumerate Applications in Win32
Your first, and most straightforward, option when shutting down a 16-bit
application under Windows NT is to shut down the entire NTVDM process. You
can do this by following the steps outlined above. You only need to know the
process ID of the NTVDM process (see the KB article 175030 cited above to
find the process ID of an NTVDM). The downside of this approach is that it
closes all 16-bit applications that are running in that VDM. If this is not
your goal, then you need to take another approach.

If you wish to shut down a single 16-bit application within a NTVDM process,
following are the steps you need to take:
Post a WM_CLOSE to all Top-Level windows that are owned by the process, and
that have the same owning thread ID as the 16-bit task you want to shut
down. The most effective way to do this is by using EnumWindows(). In your
callback function, check to see if the window's process ID and thread ID
matches the 16-bit task you want to shut down. Remember that the process ID
is going to be the process ID of the NTVDM process in which the 16-bit
application is running.
Although you have a thread ID, you have no way to wait on the termination of
the 16-bit process. As a result, you must wait for an arbitrary length of
time (to allow a clean shut down), and then try to shut the application down
anyway. If the application has already shut down, then this will do nothing.
If it hasn't shut down, then it will terminate the application.
Terminate the application using a function called VDMTerminateTaskWOW(),
which can be found in the Vdmdbg.dll. It takes the process ID of the VDM and
the task number of the 16-bit task.
This approach allows you to shut down a single 16-bit application within a
VDM under Windows NT. However, 16-bit Windows is not very good at cleaning
up resources of a terminated task, and neither is the WOWExec running in the
VDM. If you are looking for the cleanest possible approach to terminating a
16-bit application under Windows NT, you should consider terminating the
entire VDM process. NOTE: If you are starting a 16-bit application that you
may terminate later, then use the CREATE_SEPARATE_WOW_VDM with
CreateProcess().
Sample Code
The sample code implements the techniques described above for 16-bit and 32-
bit applications using the following two functions: TerminateApp() and
Terminate16App(). TerminateApp() takes a 32-bit process ID and a timeout (in
miliseconds). Terminate16App(). Both functions use explicit linking to DLL
functions so that they will be binary compatible across Windows NT and
Windows 95.
//******************
//Header
//******************

#include <windows.h>

#define TA_FAILED 0
#define TA_SUCCESS_CLEAN 1
#define TA_SUCCESS_KILL 2
#define TA_SUCCESS_16 3

DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout ) ;
DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,
WORD w16Task, DWORD dwTimeout );

//******************
//Source
//******************

#include "TermApp.h"
#include <vdmdbg.h>

typedef struct
{
DWORD dwID ;
DWORD dwThread ;
} TERMINFO ;

// Declare Callback Enum Functions.
BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) ;

BOOL CALLBACK Terminate16AppEnum( HWND hwnd, LPARAM lParam ) ;

/*DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout )

Purpose:
Shut down a 32-Bit Process (or 16-bit process under Windows 95)

Parameters:
dwPID
Process ID of the process to shut down.

dwTimeout
Wait time in milliseconds before shutting down the process.

Return Value:
TA_FAILED - If the shutdown failed.
TA_SUCCESS_CLEAN - If the process was shutdown using WM_CLOSE.
TA_SUCCESS_KILL - if the process was shut down with
TerminateProcess().
NOTE: See header for these defines.
----------------------------------------------------------------*/
DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout )
{
HANDLE hProc ;
DWORD dwRet ;

// If we can't open the process with PROCESS_TERMINATE rights,
// then we give up immediately.
hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,
dwPID);

if(hProc == NULL)
{
return TA_FAILED ;
}

// TerminateAppEnum() posts WM_CLOSE to all windows whose PID
// matches your process's.
EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID) ;

// Wait on the handle. If it signals, great. If it times out,
// then you kill it.
if(WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0)
dwRet=(TerminateProcess(hProc,0)?TA_SUCCESS_KILL:TA_FAILED);
else
dwRet = TA_SUCCESS_CLEAN ;

CloseHandle(hProc) ;

return dwRet ;
}

/*DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,
WORD w16Task, DWORD dwTimeout )

Purpose:
Shut down a Win16 APP.

Parameters:
dwPID
Process ID of the NTVDM in which the 16-bit application is
running.

dwThread
Thread ID of the thread of execution for the 16-bit
application.

w16Task
16-bit task handle for the application.

dwTimeout
Wait time in milliseconds before shutting down the task.

Return Value:
If successful, returns TA_SUCCESS_16
If unsuccessful, returns TA_FAILED.
NOTE: These values are defined in the header for this
function.

NOTE:
You can get the Win16 task and thread ID through the
VDMEnumTaskWOW() or the VDMEnumTaskWOWEx() functions.
----------------------------------------------------------------*/
DWORD WINAPI Terminate16App( DWORD dwPID, DWORD dwThread,
WORD w16Task, DWORD dwTimeout )
{
HINSTANCE hInstLib ;
TERMINFO info ;

// You will be calling the functions through explicit linking
// so that this code will be binary compatible across
// Win32 platforms.
BOOL (WINAPI *lpfVDMTerminateTaskWOW)(DWORD dwProcessId,
WORD htask) ;

hInstLib = LoadLibraryA( "VDMDBG.DLL" ) ;
if( hInstLib == NULL )
return TA_FAILED ;

// Get procedure addresses.
lpfVDMTerminateTaskWOW = (BOOL (WINAPI *)(DWORD, WORD ))
GetProcAddress( hInstLib, "VDMTerminateTaskWOW" ) ;

if( lpfVDMTerminateTaskWOW == NULL )
{
FreeLibrary( hInstLib ) ;
return TA_FAILED ;
}

// Post a WM_CLOSE to all windows that match the ID and the
// thread.
info.dwID = dwPID ;
info.dwThread = dwThread ;
EnumWindows((WNDENUMPROC)Terminate16AppEnum, (LPARAM) &info) ;

// Wait.
Sleep( dwTimeout ) ;

// Then terminate.
lpfVDMTerminateTaskWOW(dwPID, w16Task) ;

FreeLibrary( hInstLib ) ;
return TA_SUCCESS_16 ;
}

BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam )
{
DWORD dwID ;

GetWindowThreadProcessId(hwnd, &dwID) ;

if(dwID == (DWORD)lParam)
{
PostMessage(hwnd, WM_CLOSE, 0, 0) ;
}

return TRUE ;
}

BOOL CALLBACK Terminate16AppEnum( HWND hwnd, LPARAM lParam )
{
DWORD dwID ;
DWORD dwThread ;
TERMINFO *termInfo ;

termInfo = (TERMINFO *)lParam ;

dwThread = GetWindowThreadProcessId(hwnd, &dwID) ;

if(dwID == termInfo->dwID && termInfo->dwThread == dwThread )
{
PostMessage(hwnd, WM_CLOSE, 0, 0) ;
}

return TRUE ;
}

Additional query words: Kill Exit Terminate Program Application Process Task
Keywords: kbDSupport kbhowto kbKernBase kbThread KB178893
Technology: kbAudDeveloper kbOSWin2000 kbOSWin95 kbOSWinNT400
kbOSWinNTSearch kbOSWinSearch kbOSWinXP kbOSWinXPSearch kbWin32API
kbWin32sSearch

Send feedback to Microsoft
2003 Microsoft Corporation. All rights reserved.

<конец цитаты>

Как видно, единственный "законный" и "чистый" метод - это посылка сообщения
WM_CLOSE главному окну. Я подозреваю, что если главного окна у него нет, то
посылать надо в нить посредством PostThreadMessage(). Если нитей много,
наверное, всем :-), так как процесс живёт, пока у него имеется хотя бы одна
нить, и при этом неважно, в какой последовательности нити запускаются и
завершаются. Перечислить нити можно через toolhelp32 (который в WinNT based
появился только в W2K).
С консольными приложениями могут быть проблемы, если они не устанавливают
свой control-handler. Им, наверное, можно послать Ctrl-Break. Смотри
GenerateConsoleCtrlEvent().
Если не получается, всегда можно TerminateProcess() и TerminateThread(), но
это уже не "чистый" метод.
У сервисов (чем не процессы?) обязательно есть управляющая команда
SERVICE_CONTROL_STOP. Смотри ControlService(). То же для драйверов, впрочем.
Насчёт последующего запуска, так это CreateProcess(), CreateProcessAsUser()
и т.п. Проблемы разве что с именем исполняемого файла, так toolhelp32 должен

помочь. Для сервисов и драйверов - StartService().

--
С уважением, boroda
mailto:boroden***@s*****.ru

Номер выпуска : 4203
Возраст листа : 554 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/341008
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Шматко А.А. Mon, 28 Mar 2005 13:02:04 +0400 (#341008)

 

Приветствую!
On Mon, 28 Mar 2005 13:02:04 +0400
Шматко А.А. <boroden***@s*****.ru> wrote:

Спасибо,будем разбираться.
Тут ситуация специфическая.Необходима миграция базы на новую версию и Нужно
переодически останавливать сервис IB и запускать FB и наоборот. В
расчете на ситуацию когда пользователь находится далеко и скажем так не
сможет обьяснить причину неудач,выбрал слудующию конструкцию
ShellExecute(Application.Handle,Pchar('Open'),
Pchar('Rundll32.exe'),Pchar('shell32,Control_RunDLL Firebird2Control.cpl'),'',SW_SHOWNORMAL);
//ibmgr.cpl
Спасибо и janalex за нужное направление.
Думаю проще выяснить у юзера что аплет показывает.
Тут возникает другой вопрос FB иногда при установке через родной
инсталятор ругается если в системе установлен IB,хотя в документации
написано что проблем не должно быть и в системе они могут работать
одновременно.Но можно использовать скрипт или свой установщик.Так вот
если я положу Firebird2Control.cpl на свое место -это будет достаточно
чтоб он появился в контрол панели (достаточно будет если его
зарегистрировать в реестре в SharedDLLs).В документации и реестре ничего
не нашел.
С уважением Валерий.
AKA votum

Номер выпуска : 4206
Возраст листа : 554 (дней)
Количество подписчиков : 528
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/341340
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Mon, 28 Mar 2005 07:29:06 +0800 (#341340)

 

run9@m*****.ru пишет:

Прогони установку FB через FireLog и все вопросы отпадут.

Ответить   Oleg Ponomarev Tue, 29 Mar 2005 12:42:27 +0300 (#341959)