flare
Гость
|
|
« : 17-09-2003 06:38 » |
|
Каким образом можно (и можно ли вообще) создать канал передачи данных между двумя процессами, если они организованы по схеме:
Есть родительский процесс Parent, в котором создается наследуемый поток, и в этом потоке порождается новый процесс Child=CreateProcess()
так вот нужно организовать обмен данными между Parent и Child
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 17-09-2003 06:57 » |
|
Какие проблемы??? В любом случае есть возможность организации наследования - так как объекты ядра принадлежат не потокам а процессам. Вот тебе ссылка как сделать MemoryMap объект наследуемым для дочернего процесса. https://club.shelek.ru/viewart.php?id=86Кстати - иногда свой сайт полезно читать
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
sss
Специалист
Offline
|
|
« Ответ #2 : 17-09-2003 07:02 » |
|
Вводи тему IPC в поисковиках и вперед
|
|
|
Записан
|
while (8==8)
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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 извращение) Самым оптимальным вариантом, на мой взгляд являются отображаемые в память файлы(но только на одном компьютере)
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #5 : 17-09-2003 10:19 » |
|
Ну я так сразу про мап файлы и написал - надеюсь станет ясно. А кстати насчет COPY ты в винде видел процесс без обработки сообщений?
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #6 : 17-09-2003 10:36 » |
|
ты в винде видел процесс без обработки сообщений? Видел и даже активно использую. Если не использовать окна, то обработка сообщений вообще ни к чему. И сервисы с обработкой сообщений - скорее исключение, чем правило.
|
|
|
Записан
|
|
|
|
NetRaider
Гость
|
|
« Ответ #7 : 17-09-2003 10:56 » |
|
ты в винде видел процесс без обработки сообщений? Службы...
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #8 : 17-09-2003 11:11 » |
|
Отсутствие окна не есть отсутствие цикла обработки сообщений. Сервисы - это процессы работающие внутри кернель мода и там другие законы не путай нас. При работе любого процесса, даже если это обычное DOS приложение - окончание работы процесса - посыка ему Quit Message. Если таковое не обрабатывать то тогда процесс бы не заканчивался... Если ты не видишь обработчика - то это не значит что его нет
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #9 : 17-09-2003 11:26 » |
|
Сервисы - это процессы работающие внутри кернель мода и там другие законы не путай нас.
Сервисы работают только в ЮЗЕР моде! И взаимодействуют с SCM, а по сути обыкновенные Win32 программы. Сервис, работающий в кернел моде называется драйвер и сильно отличается от юзер-мод сервиса. Процессов без обработки сообщений навалом. Выход осуществляется без посылки сообщения ф-цией TerminateProcess или ExitProcess.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #10 : 17-09-2003 11:40 » |
|
Слав. Как и кто вызывает функцию TerminateProcess если система хочет завершить процесс принудительно.
Теперь по сервисам - давай определимся - что мы имеем ввиду под этим словом, я такие программы в юзер моде не встречал... Сервис системы бежит в кернель моде - то о чем мы всегда говорим и является по сути драйвером, говоря о сервисах, я о них и говорю. А что ты подразумеваешь под сервисом системы в юзер моде.... Тем более - что АПАЧ как сервер вполне подходит под оприсание сервиса, однако под Вигндой бежит в окне - с вариантом HIDEWINDOW....
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #11 : 17-09-2003 11:48 » |
|
Теперь по сервисам - давай определимся - что мы имеем ввиду под этим словом, я такие программы в юзер моде не встречал... Сервис системы бежит в кернель моде - то о чем мы всегда говорим и является по сути драйвером, говоря о сервисах, я о них и говорю. А что ты подразумеваешь под сервисом системы в юзер моде.... Тем более - что АПАЧ как сервер вполне подходит под оприсание сервиса, однако под Вигндой бежит в окне - с вариантом HIDEWINDOW....
Я не пойму о чем спор? Я этих сервисов понаписал до кучи! Если ты говоришь о тех сервисах, что назваются Services и список которых есть в Computer Management, а там их можно остановить, запустить и т.д. А также они прописаны в реестре в HKLM\System\CurrentControlSet\Services и имеют тип отличный от 0x0001, то это ЮЗЕР мод сервисы, простые exe или dll файлы, работающие в самом обыкновенном процессе. Apache- пример такого юзер мод сервиса. Скрытых окон они не создают, если им это не надо. Все сервисы с типом 0x0001-это просто драйверы.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #12 : 17-09-2003 11:56 » |
|
Слав не в падлу еще раз - напиши мне маленький файл который работает 100 циклов и выходит - не имея очереди сообщения - main() - не предлагать ибо как и АПАЧ сервис имеет очередь сообщения которая есть у консоли в которой он работает - просто окно консоли убирается после старта сервиса.!!!
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
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
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
Главный специалист
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
Помогающий
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);
} }
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #17 : 17-09-2003 14:50 » |
|
Как осуществить мечту я знаю - да и твоя программка для меня не была секретом, просто я знаю что и в этом случае есть сообщения... Вернее их аналог. Ведь любое сообщение по сути - вызов функции обработчика, как и TerminateThread. Ладно оставим - я просто считаю некорректным нестандартную апликацию - хоть это и вполне законно и может употредляется - я не видел.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #18 : 17-09-2003 15:03 » |
|
Тогда осталось только определить твое понимание сообщения. Поскольку процесс под Windows не обязан содержать содержать цикла обработки сообщений. В данном случае под сообщениями я понимаю то, что передается Send/PostMessage между окнами.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
Как по ним славик узнал что они все без этого цикла убейся не могу понять?
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #20 : 17-09-2003 15:18 » |
|
Да кстати - я хотел бы добавить, что могу вполне предположить, что моя позиция не верна.
Я никому не пытаюсь что - либо навязать или доказать- просто я ее отстаиваю - и пытаюсь говорить конструктивно.
Поэтому написания WaitForSingleObject меня несколько разозлило, ибо мы дублируем этим готовый интерфейс Post & Send Message функций, что я вообще считаю недопустимым - есть уже - заставь это работать как тебе надо. Особенно в винде.
Прошу прощения если резко ответил...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #21 : 17-09-2003 16:15 » |
|
Поэтому написания WaitForSingleObject меня несколько разозлило, ибо мы дублируем этим готовый интерфейс Post & Send Message функций, что я вообще считаю недопустимым - есть уже - заставь это работать как тебе надо. Особенно в винде.
IMHO, здесь все переставлено с ного на голову. Это этот самый интерфейс Post & Send Message функций использует WaitForSingleObject. И представить себе некое серверное приложение (ну маленький такой строк на сто TCP сервер, который только и делает, что определенный файл по запросу отправляет), которое использовало бы все это Post/Send..., могу только как очень медленное серверное приложение. Может я заблуждаюсь, но оптимальным в этом случае будет: безоконное серверное приложение и отдельное оконное приложение для конфигурации основного. Ну а для коммуникации все выше перечисленный способы. Кстати, а будет функционировать оконное приложение на компьютере без залогиненного пользователя?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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
Главный специалист
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
Главный специалист
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
Главный специалист
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 не стоит понимать буквально.
|
|
|
Записан
|
|
|
|
|