Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 50

Автор ДТонсон Π₯Π°Ρ€Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 6.3 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ процСсс посылаСт Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ процСссу запрос Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‚ΠΎΡ€ΠΎΠΉ процСсс смоТСт Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. 

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ UNIX ΠΈΠΌΠ΅ΡŽΡ‚ свои ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, pid, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сопоставимы с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ процСссов Windows. Ѐункция getpid Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetCurrentProcessID, Π½ΠΎ эквивалСнтов функциям getppid ΠΈ getgpid Π² Windows Π½Π΅ находится Π²Π²ΠΈΠ΄Ρƒ отсутствия ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² процСссов ΠΈ Π³Ρ€ΡƒΠΏΠΏ процСссов.

И, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π² UNIX ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ дСскрипторы процСссов, ΠΈ поэтому Π² Π½Π΅ΠΉ Π½Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с функциями GetCurrentProcess ΠΈΠ»ΠΈ OpenProcess.

Π’ UNIX допускаСтся использованиС дСскрипторов (descriptors) ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exec, Ссли для дСскриптора Ρ„Π°ΠΉΠ»Π° Π½Π΅ Π±Ρ‹Π» установлСн Ρ„Π»Π°Π³ close-on-exec. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ дСскрипторам Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π² силу Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с наслСдуСмыми дСскрипторами (handles) Ρ„Π°ΠΉΠ»ΠΎΠ² Windows.

Ѐункция UNIX exit, которая фактичСски являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ExitProcess; Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса Π΅ΠΌΡƒ слСдуСт ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сигнал SIGKILL. 

ОТиданиС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ, Π½ΠΎ наряду с этим ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ синхронизации с Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссом являСтся ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания Windows ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ рядом интСрСсных свойств.

β€’ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с самыми Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²; дСскрипторы процСссов ΡΠ²Π»ΡΡŽΡ‚ΡΡ лишь самым ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· рассматриваСмых Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² примСнСния этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

β€’ Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса, ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… процСссов ΠΈΠ»ΠΈ всСх процСссов, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… Π³Ρ€ΡƒΠΏΠΏΡƒ.

β€’ Π‘ущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» оТидания (time-out).

ОбС рассмотрСнных Π½ΠΈΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° синхронизации Π² сигнальноС состояниС. НапримСр, систСма ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ процСсс Π² сигнальноС состояниС, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ прСкращаСтся ΠΈΠ·Π²Π½Π΅. Ѐункциями оТидания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ впослСдствии Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 

DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds) 

DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds) 

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ оТидания ΠΈΠ»ΠΈ, Π² случаС ошибки, Ρ€Π°Π²Π½ΠΎ 0xFFFFFFFF (для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetLastError).

Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ указываСтся Π»ΠΈΠ±ΠΎ дСскриптор ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ процСсса (hObject), Π»ΠΈΠ±ΠΎ дСскрипторы ряда ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², хранящиСся Π² массивС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lpHandles. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° nCount, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MAXIMUM_WAIT_OBJECTS (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Ρ€Π°Π²Π½Ρ‹ΠΌ 64 Π² Ρ„Π°ΠΉΠ»Π΅ WINNT.Н).

dwMilliseconds β€” число миллисСкунд ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ осущСствляСтся сразу ΠΆΠ΅ послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ состояния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅ΡΡΡ‹ для опрСдСлСния ΠΈΡ… состояния Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Если ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€Π°Π²Π½ΠΎ INFINITE, Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ длится Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ процСсс Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ.

fWaitAll β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ (Ссли Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ TRUE) Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх процСссов, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ значСниями этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² случаС Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

β€’ WAIT_OBJECT_0 β€” ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» Π² сигнальноС состояниС (Π² случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitForSingleObject) ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ всС nCount ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ Π² сигнальноС состояниС (Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitForMultipleObject, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° fWaitAll Ρ€Π°Π²Π½ΠΎ TRUE).

β€’ WAIT_OBJECT_0+n, Π³Π΄Π΅ 0 ≀ n < nCount β€” Π²Ρ‹Ρ‡Ρ‚ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ WAIT_OBJECT_0 ΠΈΠ· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ процСсса Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ, ΠΊΠΎΠ³Π΄Π° оТидаСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ выполнСния любого ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов. Если Π² сигнальноС состояниС ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚ΠΎ возвращаСтся наимСньшСС ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. WAIT_ABANDONED являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² случаС использования дСскрипторов ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ²; см. Π³Π»Π°Π²Ρƒ 8.

β€’ WAIT_TIMEOUT β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° оТидания сигнализируСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹) Π½Π΅ смогли ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ оТидания.

β€’ WAIT_FAILED β€” ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ дСскриптора отсутствовали ΠΏΡ€Π°Π²Π° доступа SYNCHRONIZE.

β€’ WAIT_ABANDONED_0 β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² случаС процСссов ΠΈ рассматриваСтся Π² Π³Π»Π°Π²Π΅ 8 ΠΏΡ€ΠΈ рассмотрСнии ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ².

Для опрСдСлСния ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция GetExitCodeProcess, описанная Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π‘Π»ΠΎΠΊΠΈ ΠΈ строки окруТСния

Π‘Ρ…Π΅ΠΌΠ°, прСдставлСнная Π½Π° рис. 6.1, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊ окруТСния процСсса. Π‘Π»ΠΎΠΊ окруТСния (environment block) процСсса содСрТит ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ строк Π²ΠΈΠ΄Π°:

Имя = Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

КаТдая строка окруТСния (environment string), Π±ΡƒΠ΄ΡƒΡ‡ΠΈ символьной строкой, заканчиваСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом, Π° вСсь Π±Π»ΠΎΠΊ строк Π² Ρ†Π΅Π»ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом. Одним ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды являСтся пСрСмСнная PATH. 

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса Π² Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpEnvironment ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateProcess слСдуСт ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ NULL. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, любой процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свои ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π² Π±Π»ΠΎΠΊ окруТСния.

Для получСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ создания Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ»ΠΈ измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 

DWORD GetEnvironmentVariable(LPCTSTR lpName, LPTSTR lpValue, DWORD cchValue)

BOOL SetEnvironmentVariable(LPCTSTR lpName, LPCTSTR lpValue) 

lpName β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния. ПослС опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния ΠΎΠ½Π° добавляСтся Π² Π±Π»ΠΎΠΊ окруТСния ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ такая пСрСмСнная Ρ€Π°Π½Π΅Π΅ Π½Π΅ сущСствовала, Π° опрСдСляСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π²Π½ΠΎ NULL. Если ΠΆΠ΅ опрСдСляСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ NULL, Ρ‚ΠΎ пСрСмСнная удаляСтся ΠΈΠ· Π±Π»ΠΎΠΊΠ°. Π‘Ρ‚Ρ€ΠΎΠΊΠ° значСния Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символы "=".

Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ функция GetEnvironmentVariable Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ строки значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния, ΠΈΠ½Π°Ρ‡Π΅ β€” 0. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° lpValue, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° cchValue, оказался нСдостаточно большим, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ количСству символов, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фактичСски трСбуСтся для сохранСния значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ВспомнитС, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetCurrentDirectory (Π³Π»Π°Π²Π° 2).

Π—Π°Ρ‰ΠΈΡ‚Π° процСсса

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ функция CreateProcess прСдоставляСт ΠΏΡ€Π°Π²Π° доступа ΠΊ процСссу Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ PROCESS_ALL_ACCESS. Однако имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ опрСдСлСния Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π°Π² доступа, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²Π° доступа PROCESS_QUERY_INFORMATION, CREATE_PROCESS, PROCESS_TERMINATE, PROCESS_SET_INFORMATION, DUPLICATE_HANDLE ΠΈ CREATETHREAD. Π’ частности, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… рисков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΡΡ‚Π΅Ρ€Π΅Π³Π°Ρ‚ΡŒ вас Π² случаС ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ процСссов, Π½Π° Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ прСдоставлСниС ΠΏΡ€Π°Π² доступа ΠΊ процСссам Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ PROCESS_TERMINATE для Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… Π·Π°Ρ‰ΠΈΡ‚Ρ‹ процСссов ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² говорится Π² Π³Π»Π°Π²Π΅ 15. 

Π’ UNIX для оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСссов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait ΠΈ waitpid, ΠΎΠ΄Π½Π°ΠΊΠΎ отсутствуСт понятиС ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания, хотя функция waitpid ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ процСссы (сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ). Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ способны ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ лишь Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов, ΠΈ эквивалСнтных ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Ρ… ΠΊ ряду процСссов, Π½Π΅ сущСствуСт, хотя ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх процСссов, относящихся ΠΊ ΠΎΠ΄Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, имССтся ΠΎΠ΄Π½ΠΎ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait ΠΈ waitpid Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ сами, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, эквивалСнтной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetExitCodeProcess.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ окруТСния, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ строкам окруТСния Windows, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈ Π² UNIX. Ѐункция getenv (входящая Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π‘) ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ самыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности, Ρ‡Ρ‚ΠΎ ΠΈ функция GetEnvironmentVariable, Π½ΠΎ программист сам Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π±ΡƒΡ„Π΅Ρ€Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ putenv, setenv ΠΈ unsetenv ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы добавлСния, измСнСния ΠΈ удалСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΈ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, прСдлагая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ SetEnvironmentVariable.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ тСкстового шаблона

Настало врСмя ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° процСссы Windows Π² дСйствии. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° grepMP создаСт процСссы для поиска ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ тСкстового шаблона Π² Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ процСссу Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ UNIX-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ grep, хотя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π½Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊ любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, которая полагаСтся Π½Π° стандартный Π²Ρ‹Π²ΠΎΠ΄. РассматривайтС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ поиска ΠΊΠ°ΠΊ "Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик" ΠΈ считайтС, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° являСтся просто исполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ процСссом.