Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Взаимодействие процессов  (Прочитано 55924 раз)
0 Пользователей и 1 Гость смотрят эту тему.
flare
Гость
« : 17-09-2003 06:38 » 

Каким образом можно (и можно ли вообще) создать канал передачи данных между двумя процессами, если они организованы по схеме:

Есть родительский процесс Parent, в котором создается наследуемый поток, и в этом потоке порождается новый процесс Child=CreateProcess()

так вот нужно организовать обмен данными между Parent и Child
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 17-09-2003 06:57 » 

Какие проблемы???
В любом случае есть возможность организации наследования - так как объекты ядра принадлежат не потокам а процессам.

Вот тебе ссылка как сделать MemoryMap объект наследуемым для дочернего процесса.

https://club.shelek.ru/viewart.php?id=86

Кстати - иногда свой сайт полезно читать Улыбаюсь Ага
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #2 : 17-09-2003 07:02 » 

Вводи тему IPC в поисковиках и вперед
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 17-09-2003 07:42 » 

Да добавлю - что делится данными кроме как через память вот такого вот типа (общая память для двух процессво) можно и еще.

Делать обычные посылки данных с помощью WM_COPYDATA которая не передает указатель в параметрах а копирует данные в нужное место.
Записан

А птичку нашу прошу не обижать!!!
NetRaider
Гость
« Ответ #4 : 17-09-2003 09:51 » 

Цитата

Каким образом можно (и можно ли вообще) создать канал передачи данных между двумя процессами?



Варианты
1. Буфер обмена. Недостаток в том, что любые другие процессы имеют к нему доступ. Что из этого следует, я думаю объяснять не надо.

2. Использовать сообщение WM_COPYDATA. Минусы - необходим цикл сообщений для каждого из участвующих процессов.

3. Отображаемые в память файлы. Плюсы - встроенная поддержка безопасности и большой объем передаваемых данных. Возможна передача данных более чем между двумя процессами. Но неоходимо обеспечить синхронизацию.

3. Mailslots. Также возможна передача данных более чем между двумя процессами. Используют одностороннюю передачу данных. Поддерживают broadcast. Лучше подходят для передачи небольших объемов данных.

4. Pipes. Бывают анонимные и именованные. Анонимные могут быть использованы только на одном компьютере. Хорошо подходят для связи двух процессов. Именованные - поддерживают связь между компьютерами.

5. Сокеты

Еще альтернативы - DDE(устаревший метод), RPC(для вызова процедур в других процессах), COM(если только для передачи данных - IMHO извращение)

Самым оптимальным вариантом, на мой взгляд являются отображаемые в память файлы(но только на одном компьютере)
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 17-09-2003 10:19 » 

Ну я так сразу про мап файлы и написал - надеюсь станет ясно.
А кстати насчет COPY ты в винде видел процесс без обработки сообщений?Не понял
Записан

А птичку нашу прошу не обижать!!!
Diletant
Помогающий

de
Offline Offline

« Ответ #6 : 17-09-2003 10:36 » 

Цитата
ты в винде видел процесс без обработки сообщений?Не понял


Видел и даже активно использую. Если не использовать окна, то обработка сообщений вообще ни к чему. И сервисы с обработкой сообщений - скорее исключение, чем правило.
Записан
NetRaider
Гость
« Ответ #7 : 17-09-2003 10:56 » 

Цитата

ты в винде видел процесс без обработки сообщений?Не понял


Службы...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 17-09-2003 11:11 » 

Отсутствие окна не есть отсутствие цикла обработки сообщений.

Сервисы - это процессы работающие внутри кернель мода и там другие законы не путай нас. Улыбаюсь

При работе любого процесса, даже если это обычное DOS приложение - окончание работы процесса - посыка ему Quit Message.
Если таковое не обрабатывать то тогда процесс бы не заканчивался...
Если ты не видишь обработчика - то это не значит что его нет
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 17-09-2003 11:26 » 

Цитата

Сервисы - это процессы работающие внутри кернель мода и там другие законы не путай нас.


Сервисы работают только в ЮЗЕР моде! И взаимодействуют с SCM, а по сути обыкновенные Win32 программы.
Сервис, работающий в кернел моде называется драйвер и сильно отличается от юзер-мод сервиса.
Процессов без обработки сообщений навалом. Выход осуществляется без посылки сообщения ф-цией TerminateProcess или ExitProcess.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #10 : 17-09-2003 11:40 » 

Слав. Как и кто вызывает функцию TerminateProcess если система хочет завершить процесс принудительно.

Теперь по сервисам - давай определимся - что мы имеем ввиду под этим словом, я такие программы в юзер моде не встречал... Сервис системы бежит в кернель моде - то о чем мы всегда говорим и является по сути драйвером, говоря о сервисах, я о них и говорю.
А что ты подразумеваешь под сервисом системы в юзер моде....
Тем более - что АПАЧ как сервер вполне подходит под оприсание сервиса, однако под Вигндой бежит в окне - с вариантом HIDEWINDOW....
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 17-09-2003 11:48 » 

Цитата

Теперь по сервисам - давай определимся - что мы имеем ввиду под этим словом, я такие программы в юзер моде не встречал... Сервис системы бежит в кернель моде - то о чем мы всегда говорим и является по сути драйвером, говоря о сервисах, я о них и говорю.
А что ты подразумеваешь под сервисом системы в юзер моде....
Тем более - что АПАЧ как сервер вполне подходит под оприсание сервиса, однако под Вигндой бежит в окне - с вариантом HIDEWINDOW....


 Я не пойму о чем спор? Я этих сервисов понаписал до кучи! Если ты говоришь о тех сервисах, что назваются Services и список которых есть в Computer Management, а там их можно остановить, запустить и т.д. А также они прописаны в реестре в HKLM\System\CurrentControlSet\Services и имеют тип отличный от 0x0001, то это ЮЗЕР мод сервисы, простые exe или dll файлы, работающие в самом обыкновенном процессе. Apache- пример такого юзер мод сервиса. Скрытых окон они не создают, если им это не надо.
 Все сервисы с типом 0x0001-это просто драйверы.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #12 : 17-09-2003 11:56 » 

Слав не в падлу еще раз - напиши мне маленький файл который работает 100 циклов и выходит - не имея очереди сообщения - main() - не предлагать ибо как и АПАЧ сервис имеет очередь сообщения которая есть у консоли в которой он работает - просто окно консоли убирается после старта сервиса.!!!
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #13 : 17-09-2003 12:14 » 

#include <windows.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
   for(int i=0; i<100;++i)
   {
      Sleep(1);
   }
}

компилить как /SUBSYSTEM:WINDOWS
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #14 : 17-09-2003 12:23 » 

Теперь изменим
Цитата

#include <windows.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
for(int i=0; i<100;++i)
{
Sleep(1);
}
}


#include <windows.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int * i;
 
while(1)
{
i = new i;
Sleep(1);
delete(i);
}
}


Как правильно выйти из такого процесса Не понял
Т.е. условие в While должно быть таким, которое станет 0 в момент когда сторонний процесс захочет его остановить - т.е. выход в момент Sleep через Terminate запрещен.

ИМХО возможность создания такого процесса не корректен.

И я не видел ни разу кода сервиса , который так бы работал.

Может быть я и не прав....  :?
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #15 : 17-09-2003 12:44 » 

Цитата
Как правильно выйти из такого процесса

Ждать на событии, читать pipe и т.д. Вариантов выхода из программ придумано до кучи.

Так вот SCM(Service Control Meneger) вызывает ф-ции сервиса, через callback ф-цию, которую регистрируют при старте сервиса. SCM это набор ф-ций, которые управляют сервисами и когда хотят остановить сервис, то SCM вызывает эту callback ф-цию с кодом, указывающем, что сервис хотят остановить - SERVICE_CONTROL_STOP . SCM общается с потоком сервиса(из этого потока он вызывает сallback ф-цию) посредством IPC, никаких окон он не создает.

Цитата
ИМХО возможность создания такого процесса не корректен.

Это я вобще не понял!
Чего это некорректного в моем процессе?

Цитата
И я не видел ни разу кода сервиса , который так бы работал.

Плохо смотрел.


А вот как осуществить твою мечту

Код:
int APIENTRY _tWinMain)HINSTANCE hInstance, 
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow:
{
int * i;

Создаем событие, получаем handle.

while(WaitForSingleObject(hEvent,0) != WAIT_OBJECT_0)
{
i = new i;
Sleep(1);
delete(i);
}
}

Будет крутится пока событие не перейдет в сигнальное состояние. А поставить событие в сигнальное состояние можно из другого процесса.
« Последнее редактирование: 07-04-2009 16:56 от Алексей1153++ » Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #16 : 17-09-2003 14:30 » 

Можно даже обойтись без Sleepа и тогда процесс будет останавливаться с точноcтью до интервала переключения между потоками
Цитата

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int * i;

Создаем событие, получаем handle.

while(WaitForSingleObject(hEvent,1) == WAIT_TIMEOUT)
{
i = new i;
delete(i);

}
}
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #17 : 17-09-2003 14:50 » 

Улыбаюсь Как осуществить мечту Улыбаюсь я знаю - да и твоя программка для меня не была секретом, просто я знаю что и в этом случае есть сообщения... Вернее их аналог.
Ведь любое сообщение по сути - вызов функции обработчика, как и TerminateThread.
Ладно оставим - я просто считаю некорректным нестандартную апликацию - хоть это и вполне законно и может употредляется - я не видел.
Записан

А птичку нашу прошу не обижать!!!
Diletant
Помогающий

de
Offline Offline

« Ответ #18 : 17-09-2003 15:03 » 

Тогда осталось только определить твое понимание сообщения. Поскольку процесс под Windows не обязан содержать содержать цикла обработки сообщений. В данном случае под сообщениями я понимаю то, что передается Send/PostMessage между окнами.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #19 : 17-09-2003 15:15 » 

Diletant, а что не понятно???
Я разве спорю??
Выполнение передачи сообщения = вызову системой CALLBACK функции WndProc котора по определению присутствует в любой апликации.

Представить себе процесс без окна и таких сообщений могу.
Могу даже представить себе задачи, которые можно решать таким методом.
Однако укорачивать себе ноги дабы удинить пенис - пардон, лишать себя стандартной ситемной возможности донести данные и информацию о процессе минимальными средствами и затратами на обслуживание считаю неправильным - иначе говоря некорректным.

Только обозвать такую программу сервисом - не могу - любой сервис рабоатет в таесной свзи с системой и говорить об отсутствии там стандартных методов общения - думаю это не так.

Фактически мы создаем свою систему CALLBACK функций с вызовами по сообщениями на WaitForSingleObject.

В примере все красиво, но если расписать серьезно управляемый сервис с серьезными функциями - то любой программер напишет кучу ненужного кода, для обеспечения такой работы.
А написать распаковку сообщений и создать нужный цикол - гораздо проще и быстрее...
Кстати кто то меня уже тут агитировал за использование встроенного кода вместо написания своего - в данном случае я двумя руками ЗА.


Вот список сервисов в моем компе

Name   Description   Status     Startup Type   Log On As
Apache   Apache/1.3.22 (Win32)   Started   Automatic   LocalSystem
Apache Tomcat 4.1      Started   Automatic   LocalSystem
Application Management   Provides software installation services such as Assign, Publish, and Remove.      Manual   LocalSystem
Automatic Updates   Enables the download and installation of critical Windows updates. If the service is disabled, the operating system can be manually updated at the Windows Update Web site.   Started   Automatic   LocalSystem
Background Intelligent Transfer Service   Transfers files in the background using idle network bandwidth. If the service is disabled, then any functions that depend on BITS, such as Windows Update or MSN Explorer will be unable to automatically download programs and other information.      Manual   LocalSystem
ClipBook   Supports ClipBook Viewer, which allows pages to be seen by remote ClipBooks.      Manual   LocalSystem
COM+ Event System   Provides automatic distribution of events to subscribing COM components.   Started   Manual   LocalSystem
DefWatch      Started   Automatic   LocalSystem
DHCP Client   Manages network configuration by registering and updating IP addresses and DNS names.   Started   Automatic   LocalSystem
Distributed Link Tracking Client   Sends notifications of files moving between NTFS volumes in a network domain.   Started   Automatic   LocalSystem
Distributed Transaction Coordinator   Coordinates transactions that are distributed across two or more databases, message queues, file systems, or other transaction protected resource managers.      Manual   LocalSystem
DNS Client   Resolves and caches Domain Name System (DNS) names.   Started   Automatic   LocalSystem
Event Log   Logs event messages issued by programs and Windows.  Event Log reports contain information that can be useful in diagnosing problems.  Reports are viewed in Event Viewer.   Started   Automatic   LocalSystem
Fax Service   Helps you send and receive faxes      Manual   LocalSystem
Indexing Service   Indexes contents and properties of files on local and remote computers; provides rapid access to files through flexible querying language.      Manual   LocalSystem
Internet Connection Sharing   Provides network address translation, addressing, and name resolution services for all computers on your home network through a dial-up connection.      Manual   LocalSystem
IPSEC Policy Agent   Manages IP security policy and starts the ISAKMP/Oakley (IKE) and the IP security driver.      Automatic   LocalSystem
IPSecurity Server   Provides IP Security and allows remote clients to connect to this computer        Started   Automatic   LocalSystem
Logical Disk Manager   Logical Disk Manager Watchdog Service   Started   Automatic   LocalSystem
Logical Disk Manager Administrative Service   Administrative service for disk management requests      Manual   LocalSystem
Machine Debug Manager   Supports local and remote debugging for Visual Studio and script debuggers. If this service is stopped, the debuggers will not function properly.   Started   Automatic   LocalSystem
MySql      Started   Automatic   LocalSystem
NetMeeting Remote Desktop Sharing   Allows authorized people to remotely access your Windows desktop using NetMeeting.      Manual   LocalSystem
Network Connections   Manages objects in the Network and Dial-Up Connections folder, in which you can view both local area network and remote connections.   Started   Manual   LocalSystem
Network DDE   Provides network transport and security for dynamic data exchange (DDE).      Manual   LocalSystem
Network DDE DSDM   Manages shared dynamic data exchange and is used by Network DDE      Manual   LocalSystem
Norton AntiVirus Client      Started   Automatic   LocalSystem
NVIDIA Driver Helper Service         Automatic   LocalSystem
Performance Logs and Alerts   Configures performance logs and alerts.      Manual   LocalSystem
Plug and Play   Manages device installation and configuration and notifies programs of device changes.   Started   Automatic   LocalSystem
Portable Media Serial Number Service   Retrieves the serial number of any portable media player connected to this computer. If this service is stopped, protected content might not be down loaded to the device.      Manual   LocalSystem
Print Spooler   Loads files to memory for later printing.   Started   Automatic   LocalSystem
Protected Storage   Provides protected storage for sensitive data, such as private keys, to prevent access by unauthorized services, processes, or users.   Started   Automatic   LocalSystem
QoS RSVP   Provides network signaling and local traffic control setup functionality for QoS-aware programs and control applets.      Manual   LocalSystem
Remote Access Auto Connection Manager   Creates a connection to a remote network whenever a program references a remote DNS or NetBIOS name or address.      Manual   LocalSystem
Remote Access Connection Manager   Creates a network connection.   Started   Manual   LocalSystem
Remote Procedure Call (RPC)   Provides the endpoint mapper and other miscellaneous RPC services.   Started   Automatic   LocalSystem
Remote Registry Service   Allows remote registry manipulation.      Automatic   LocalSystem
Removable Storage   Manages removable media, drives, and libraries.   Started   Automatic   LocalSystem
Routing and Remote Access   Offers routing services to businesses in local area and wide area network environments.      Disabled   LocalSystem
RunAs Service   Enables starting processes under alternate credentials   Started   Automatic   LocalSystem
Security Accounts Manager   Stores security information for local user accounts.   Started   Automatic   LocalSystem
Smart Card   Manages and controls access to a smart card inserted into a smart card reader attached to the computer.      Manual   LocalSystem
Smart Card Helper   Provides support for legacy smart card readers attached to the computer.      Manual   LocalSystem
Still Image Service      Started   Automatic   LocalSystem
System Event Notification   Tracks system events such as Windows logon, network, and power events.  Notifies COM+ Event System subscribers of these events.   Started   Automatic   LocalSystem
Task Scheduler   Enables a program to run at a designated time.   Started   Automatic   LocalSystem
TCP/IP NetBIOS Helper Service   Enables support for NetBIOS over TCP/IP (NetBT) service and NetBIOS name resolution.   Started   Automatic   LocalSystem
Telephony   Provides Telephony API (TAPI) support for programs that control telephony devices and IP based voice connections on the local computer and, through the LAN, on servers that are also running the service.   Started   Manual   LocalSystem
Telnet   Allows a remote user to log on to the system and run console programs using the command line.      Manual   LocalSystem
Uninterruptible Power Supply   Manages an uninterruptible power supply (UPS) connected to the computer.      Manual   LocalSystem
Utility Manager   Starts and configures accessibility tools from one window       Manual   LocalSystem
Visual Studio Analyzer RPC bridge         Manual   LocalSystem
Visual Studio Debugger Proxy Service   Provides detach capability for debuggers      Manual   LocalSystem
Windows Installer   Installs, repairs and removes software according to instructions contained in .MSI files.      Manual   LocalSystem
Windows Management Instrumentation   Provides system management information.   Started   Automatic   LocalSystem
Windows Management Instrumentation Driver Extensions   Provides systems management information to and from drivers.   Started   Manual   LocalSystem
Windows Time   Sets the computer clock.      Manual   LocalSystem
Wireless Configuration   Provides authenticated network access control using IEEE 802.1x for wired and wireless Ethernet networks.      Manual   LocalSystem

Как по ним славик узнал что они все без этого цикла убейся не могу понять?
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #20 : 17-09-2003 15:18 » 

Да кстати - я хотел бы добавить, что могу вполне предположить, что моя позиция не верна.

Я никому не пытаюсь что - либо навязать или доказать- просто я ее отстаиваю - и пытаюсь говорить конструктивно.

Поэтому написания WaitForSingleObject меня несколько разозлило, ибо мы дублируем этим готовый интерфейс Post & Send Message функций, что я вообще считаю недопустимым - есть уже - заставь это работать как тебе надо. Особенно в винде.

Прошу прощения если резко ответил...
Записан

А птичку нашу прошу не обижать!!!
Diletant
Помогающий

de
Offline Offline

« Ответ #21 : 17-09-2003 16:15 » 

Цитата
Поэтому написания WaitForSingleObject меня несколько разозлило, ибо мы дублируем этим готовый интерфейс Post & Send Message функций, что я вообще считаю недопустимым - есть уже - заставь это работать как тебе надо. Особенно в винде.


IMHO, здесь все переставлено с ного на голову. Это этот самый интерфейс Post & Send Message функций использует WaitForSingleObject. И представить себе некое серверное приложение (ну маленький такой строк на сто TCP сервер, который только и делает, что определенный файл по запросу отправляет), которое использовало бы все это Post/Send..., могу только как очень медленное серверное приложение.
Может я заблуждаюсь, но оптимальным в этом случае будет: безоконное серверное приложение и отдельное оконное приложение  для конфигурации основного. Ну а для коммуникации все выше перечисленный способы.
Кстати, а будет функционировать оконное приложение  на компьютере без залогиненного пользователя?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #22 : 17-09-2003 16:36 » 

Сервер на 100 строк это всего лишь процесс с окном и 2 потока - не вижу смысла делить на процессы???
В вторых - передачу данных постоянную действительно невозможно сделать более быстро чем чере мапированную память - но это другой разговор...

Кроме серверных приложений есть куча сервисов которые работают без необходимости в постоянном обмене информацией - а имеют назначение встраиваться в систему и быть оконно конфигурируемыми, поэтому одноразовая передача в сервис партии данных вполне может пройти PostMessage вместо сложного механизма общей памяти.


Далее...
Организация очереди может и основана на WaitForSingleObject но сама обработка - это вызов функции...

А вообще как я и говорил - это личное дело каждого - по мне легче создать процесс с кучей потоков и сделать окну SW_HIDE после чего вызывать его SW_SHOW только в случае необходимости отконтролировать - чем писать два процесса и писать прорыв за область памяти пролцесса только для передачи конфигурационной инфы...
Записан

А птичку нашу прошу не обижать!!!
NetRaider
Гость
« Ответ #23 : 18-09-2003 03:37 » 

Итак, имеем две точки зрения:

Цитата

Сервисы - это процессы работающие внутри кернель мода и там другие законы не путай нас.

и
Цитата

Сервисы работают только в ЮЗЕР моде! И взаимодействуют с SCM, а по сути обыкновенные Win32 программы.
Сервис, работающий в кернел моде называется драйвер и сильно отличается от юзер-мод сервиса.


Как ни странно, в каждой цитате есть толика правды Улыбаюсь :

Служба(сервис) Windows NT это процесс, который может запускаться и работать без участия пользователя. Они обычно запускаются при загрузке системы и работают до ее выключения(хотя можно запускать и останавливать в процессе работы). Управлением служб занимается Service Control Manager(SCM). Через него проходят все запросы от внешних программ. В Windows NT существут два(!) вида служб: SERVICE_DRIVER - службы режима ядра(драйвера) и SERVICE_WIN32 - службы Win32(обычные процессы). Полный список
типов таков:

SERVICE_KERNEL_DRIVER - Служба ядра(драйвер)
SERVICE_FILE_SYSTEM_DRIVER - Служба ядра(драйвер файловой системы).
SERVICE_WIN32_OWN_PROCESS - Win32 служба.
SERVICE_WIN32_SHARE_PROCESS (служба, выполняющаяся совместно с другими службами)

Каждая Win32 служба привязана к определенной оконной станции и рабочему столу. В зависимости от этого определяется возможность взаимодействия службы с другими процессами. Например, невозможно послать сообщение окну с другого рабочего стола(WM_COPYDATA тут тоже бессильна).

Как завершаются процессы(может не в тему, но все же...)
Навеяно во этим:

Цитата

При работе любого процесса, даже если это обычное DOS приложение - окончание работы процесса - посыка ему Quit Message.
Если таковое не обрабатывать то тогда процесс бы не заканчивался...
Если ты не видишь обработчика - то это не значит что его нет


(допустим, что пользователь вошол в систему)

Когда некий процесс вызывает функцию ExitWindowsEx, модулю Csrss посылается команда о подготовке к выключению. Csrss, в свою очередь имперсоонирует вызывающего пользователя(того, кто вызвал ExitWindowsEx) и посылает специальное Windows message в скрытое окно, владельцем которого является winlogon, сообщающего, что необходимо выполнить выключение компьютера. Далее winlogon имперсоонирует залогиненного пользователя(необязательно того, кто вызвал ExitWindowsEx) и вызывает  ExitWindowsEx с измененными системными флагами. После этого Csrss видя, что запрос поступил от winlogon'а, выполняет следующую процедуру:

Для каждого процесса, который имеет окно верхнего уровня, посылается сообщение WM_QUERYENDSESSION в каждый поток в процессе, который имеет цикл цикл обработки сообщений. Если поток возвращает TRUE, это значит что выключение можно продолжать. Затем Csrss посылает сообщение WM_ENDSESSION в поток, говоря ему, чтобы он завершился. Csrss ожидает некоторое время в секундах, определенное в
HKCU\Control anel\Desktop\HungAppTimeout. Если по истечении этого времени один из потоков процесса не отвечает, Csrss отображает диалоговое окно о принудительном завершении программы. В случае, если все потоки завершаются вовремя, Csrss завершает процесс и переходит к другому.

Если Csrss находит консольное приложение, обработчику управления консоли посылается событие CTRL_LOGOFF_EVENT. В случае, если
обработчик возвратил FALSE, Csrss убивает процесс. Если же обработчик возвратил TRUE, либо не ответил в течении времени,
определенного в HKCU\Control Panel\Desktop\WaitToKillAppTimeout появляется уже знакомое окно о принудительном завершении процесса.

На следующем шаге winlogon вызывает ExitWindowsEx для того, чтобы Csrss завершила COM процессы, выполняющиеся интерактивно.

После вышеописанных манипуляций все процессы пользовательской сессии завершены. Далее происходит завершение служб вызов
функции NtShutdownSystem для выгрузки драйверов.
====

Csrss(client/server run-time subsystem) - это часть подсистемы Win32, ответственная за консольные окна, создание и/или удаление потоков и выполняющая некоторые другие вещи.
Записан
NetRaider
Гость
« Ответ #24 : 18-09-2003 03:39 » 

P.S. кстати как нормально форматировать большие куски текста для отправки на форум ? переносы строк оказываются в непонятных местах  Жаль
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #25 : 18-09-2003 05:22 » 

to Diletant
Цитата

IMHO, здесь все переставлено с ного на голову. Это этот самый интерфейс Post & Send Message функций использует WaitForSingleObject. И представить себе некое серверное приложение (ну маленький такой строк на сто TCP сервер, который только и делает, что определенный файл по запросу отправляет), которое использовало бы все это Post/Send..., могу только как очень медленное серверное приложение.
Может я заблуждаюсь, но оптимальным в этом случае будет: безоконное серверное приложение и отдельное оконное приложение для конфигурации основного. Ну а для коммуникации все выше перечисленный способы.
Кстати, а будет функционировать оконное приложение на компьютере без залогиненного пользователя?


Полностью согласен.
Я до сих пор не пойму с какой стати Grom зачислил все приложения, не использующие очередь сообщений, в число некорректных? Microsoft пишет некорректные приложения- понаписала кучу сервисов некорректных!

Цитата

Тогда осталось только определить твое понимание сообщения. Поскольку процесс под Windows не обязан содержать содержать цикла обработки сообщений. В данном случае под сообщениями я понимаю то, что передается Send/PostMessage между окнами.


Вот именно. Если применять терминологию Windows то сообщения посылаются только в GUI. В UNIX немного по другому, там еще и сигналы есть, они даже ближе к нашей теме.

to Grom
Цитата

Я разве спорю??
Выполнение передачи сообщения = вызову системой CALLBACK функции WndProc котора по определению присутствует в любой апликации.

Представить себе процесс без окна и таких сообщений могу.


WndProc не обязана присутствовать в любом приложении, как не обязано оно создавать очередь сообщений и обрабатывать их.  Тут у тебя заблуждение.

Цитата

Как по ним славик узнал что они все без этого цикла убейся не могу понять?


Я просто знаю как пишутся сервисы и как они взаимодействуют с системой. Сервису(как и любой программе без окон) не нужен цикл обработки сообщений, по умолчанию винда считает таковыми все программы а подключает к ним графику только когда они вызывают первую API ф-цию, относящуюся к GUI.

Цитата

я знаю - да и твоя программка для меня не была секретом, просто я знаю что и в этом случае есть сообщения... Вернее их аналог.


Давай применять корректную терминологию. Нет никаких сообщений при вызове ф-ций WaitFor.... и даже их аналогов. Ядро проверяет объект событие и если оно не в сигнальном состоянии, а время ожидания отлично от нуля, то процесс не планируется на выполнение, как только событие перейдет в сигнальное состояние, ядро пройдетсмя по списку ожидающих его потоков и разрешит планировать их на выполнение.

to NetRaider

Цитата

SERVICE_KERNEL_DRIVER - Служба ядра(драйвер)
SERVICE_FILE_SYSTEM_DRIVER - Служба ядра(драйвер файловой системы).
SERVICE_WIN32_OWN_PROCESS - Win32 служба.
SERVICE_WIN32_SHARE_PROCESS (служба, выполняющаяся совместно с другими службами)


Первые два драйвера в чистом виде(кстати я про это говорил). Вторые- чистые юзер мод приложения.

Цитата

Когда некий процесс вызывает функцию ExitWindowsEx, модулю Csrss


А про это ты зачем написал? ExitWindowSEx не имеет отношения к нашей дискуссии. CSRSS занимается перерисовкой консольных приложений(в этом легко убедится открыв консольное окно и начав его быстро таскать по экрану - csrss сразу начнет отожирать процессорное время.
) и поддержкой Win32 подсистемы. Тут ты не в тему попал.

Цитата

функции NtShutdownSystem для выгрузки драйверов.


драйвера при выключении системы не выгружаются, это излишне, достаточно сбросить буфера(IRP_MJ_SHUTDOWN) и оповестить все устройства о выключении питания.
Записан
NetRaider
Гость
« Ответ #26 : 18-09-2003 06:11 » 

Цитата

Цитата

SERVICE_KERNEL_DRIVER - Служба ядра(драйвер)
SERVICE_FILE_SYSTEM_DRIVER - Служба ядра(драйвер файловой системы).
SERVICE_WIN32_OWN_PROCESS - Win32 служба.
SERVICE_WIN32_SHARE_PROCESS (служба, выполняющаяся совместно с другими службами)


Первые два драйвера в чистом виде(кстати я про это говорил). Вторые- чистые юзер мод приложения.


Дело в том, что драйвер в чистом виде можно установить как службу NT, в этом случае служба будет функционировать в режиме ядра.

Цитата

А про это ты зачем написал? ExitWindowSEx не имеет отношения к нашей дискуссии


Там выше написоно - "может не в тему, но все же..."  и цитата ниже.

А чем занимается Csrss написано в MSDN:
Csrss.exe
This is the user-mode portion of the Win32 subsystem (with Win32.sys being the kernel-mode portion). Csrss stands for client/server run-time subsystem and is an essential subsystem that must be running at all times. Csrss is responsible for console windows, creating and/or deleting threads, and some parts of the 16-bit virtual MS-DOS environment.

Про выгрузку драйверов согласен - ошибся.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #27 : 18-09-2003 06:37 » 

Цитата

Дело в том, что драйвер в чистом виде можно установить как службу NT, в этом случае служба будет функционировать в режиме ядра.


Я думаю мне об этом не надо рассказывать, фраза странная у тебя вышла.

Цитата

creating and/or deleting threads


Очередное скрытие фактов от Майкрософт.
При создании процесса или потока подсистему win32 уведомляют о создании процесса или потока, вот собственно перечисление того, что там делает csrss при создании процесса(Inside Windows 2000), а код можно посмотреть в "Windows NT/2000 Native API"
After all the necessary executive process and thread objects have been created, Kernel32.dll sends a message to the Win32 subsystem so that it can set up for the new process and thread. The message includes the following information:


Process and thread handles


Entries in the creation flags


ID of the process's creator


Flag indicating whether the process belongs to a Win32 application (so that Csrss can determine whether or not to show the startup cursor)

The Win32 subsystem performs the following steps when it receives this message:


CreateProcess duplicates a handle for the process and thread. In this step, the usage count of the process and the thread is incremented from 1 (set at creation time) to 2.


If a process priority class isn't specified, CreateProcess sets it according to the algorithm described below.


The Csrss process block is allocated.


The new process's exception port is set to be the general function port for the Win32 subsystem so that the Win32 subsystem will receive a message when an exception occurs in the process. (For further information on exception handling, see Chapter 3.)


If the process is being debugged (that is, if it is attached to a debugger process), the process debug port is set to the Win32 subsystem's general function port. This setting ensures that Windows 2000 will send debug events that occur in the new process (such as thread creation and deletion, exceptions, and so on) as messages to the Win32 subsystem so that it can then dispatch the events to the process that is acting as the new process's debugger.


The Csrss thread block is allocated and initialized.


CreateProcess inserts the thread in the list of threads for the process.


The count of processes in this session is incremented.


The process shutdown level is set to x280 (the default process shutdown level—see SetProcessShutdownParameters in the MSDN Library documentation for more information).


The new process block is inserted into the list of Win32 subsystem-wide processes.


The per-process data structure used by the kernel-mode part of the Win32 subsystem (W32PROCESS structure) is allocated and initialized.


The application start cursor is displayed. This cursor is the familiar arrow with an hourglass attached—the way that Windows 2000 says to the user, "I'm starting something, but you can use the cursor in the meantime." If the process doesn't make a GUI call after 2 seconds, the cursor reverts to the standard pointer. If the process does make a GUI call in the allotted time, CreateProcess waits 5 seconds for the application to show a window. After that time, CreateProcess will reset the cursor again.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #28 : 18-09-2003 06:49 » 

Цитата

Дело в том, что драйвер в чистом виде можно установить как службу NT, в этом случае служба будет функционировать в режиме ядра.


Ты сам вдумайся в то что написал. Можно подумать, что службу можно перевести из юзер мода в кернел мод. Наличие одинакового API для запуска и установки ни о чем не говорит. Драйвера не взаимодействют с SCM, службы обязаны с ним работать. Попытка запустить службу в режиме ядра сразу вызовет BSOD, так как эквивалентна попытке запуска обыкновенной юзерской программы в режиме ядра.
Записан
NetRaider
Гость
« Ответ #29 : 18-09-2003 07:24 » 

Цитата

Цитата

Дело в том, что драйвер в чистом виде можно установить как службу NT, в этом случае служба будет функционировать в режиме ядра.


Я думаю мне об этом не надо рассказывать.


А какже это:
Цитата

Сервисы работают только в ЮЗЕР моде! И взаимодействуют с SCM, а по сути обыкновенные Win32 программы.
Сервис, работающий в кернел моде называется драйвер и сильно отличается от юзер-мод сервиса.


Драйвер это не сервис, работающий в режиме ядра, тогда как сервис работающий в режиме ядра - драйвер.

Цитата

Очередное скрытие фактов от Майкрософт.

creating and/or deleting threads.
Кроме того в этом контексте понятия creating и deleting не стоит понимать буквально.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines