Contents:
- 1 Kernel Object ¶õ?
- 2 A Process's Kernel Object Handle Table
- 2.1 Creating a kernel Object
- 2.2 Closing a Kernel Object
2 A Process's Kernel Object Handle Table #
Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµé Å×À̺íÀº ½Ã½ºÅÛ¿¡ ÀÇÇÏ¿© »ý¼ºµÇ°í ÃʱâÈ µÇ¸ç °¢ ÇÁ·Î¼¼½º¿¡ ÇϳªÀÇ ÇÚµé Å×À̺íÀÌ Á¸ÀçÇÑ´Ù. ÇÚµé Å×ÀÌºí¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ °ÍÀº ¹®¼ÈµÇ¾î ÀÖÁö ¾ÊÁö¸¸ ´ë·« ´ÙÀ½°ú °°Àº ±¸Á¶·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
<Ç¥ 1> ÇÁ·Î¼¼½ºÀÇ ÇÚµé Å×ÀÌºí ±¸Á¶
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0x???????? | 0x???????? | 0x???????? |
| 2 | 0x???????? | 0x???????? | 0x???????? |
| ... | ... | ... | ... |
2.1 Creating a kernel Object #
ÇÚµé Å×À̺íÀº ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© ÃʱâÈ µÉ ¶§ ºñ¾î ÀÖÁö¸¸ »õ·Î¿î Ä¿³Î ¿ÀºêÁ§Æ®°¡ »ý¼ºµÉ ¶§ ¸¶´Ù ºñ¾î ÀÖ´Â °÷À» ã¾Æ¼ ÃʱâÈ ÇÑ´Ù.
¿¹ 1> Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö
- CreateThread()
- CreateFile()
- CreateMutex()
- CreateSemaphore()
- CreateEvent()
- ±× ¹Û¿¡ ...
Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ´Â ¸ðµç ÇÔ¼öµéÀº ÇÚµé°ú °ü·ÃµÈ °ªÀ» ¹ÝȯÇÑ´Ù. ±×·¯³ª À̵é ÇÚµé °ªÀº ½ÇÁ¦ ÇÚµéÀÌ ¾Æ´Ï¸ç ÇÚµé Å×À̺íÀÇ À妽º¸¦ ¸»ÇÑ´Ù. Windows 2000 ÀÇ °æ¿ì À妽º °ªÀ̶ó°í Çϱ⺸´Ù ÇÚµé Å×À̺íÀÇ Byte ¼ö·Î ±¸ºÐÇϱâ À§ÇÏ¿© ¹ÝȯÇÏ´Â °ªÀÌ´Ù.
¶ÇÇÑ À߸øµÈ ÇÚµéÀ» »ç¿ëÇÒ °æ¿ì ÇÚµéÀ» »ç¿ëÇÏ´Â ÇÔ¼öµéÀº ½ÇÆÐÇϸç GetLastError() ÇÔ¼ö´Â ERROR_INVALID_HANDLE (6) ¿¡·¯¸¦ ¸®ÅÏÇÑ´Ù.
Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ´Â ÇÔ¼öµéÀÌ ½ÇÆÐÇÒ °æ¿ì ÀϹÝÀûÀ¸·Î NULL (0) °ªÀ» ¸®ÅÏÇÑ´Ù. ÇÏÁö¸¸ ÀϺΠÇÔ¼öÀÇ °æ¿ì INVALID_HANDLE_VALUE (-1) °ªÀ» ¸®ÅÏÇϹǷΠÁÖÀÇÇØ¾ß ÇÑ´Ù.
¿¹ 2-1> INVALID_HANDLE_VALUE °ªÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö
HANDLE hMutex = CreateMutex( ... );
if( hMutex == INVALID_HANDLE_VALUE ) {
// We will never execute this code because
// CreateMutex returns NULL if it fails.
}
¿¹ 2-2> NULL °ªÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö
HANDLE hFile = CreateFile( ... );
if( hFile == NULL ) {
// We will never execute this code because CreateFile
// returns INVALID_HANDLE_VALUE(-1) if it fails.
}
2.2 Closing a Kernel Object #
¸ðµç Ä¿³Î ¿ÀºêÁ§Æ®´Â CloseHandle() ÇÔ¼ö·Î ÇÚµéÀ» ´Ý´Â´Ù.
BOOL CloseHandle( HANDLE hobj );
ÀÌ ÇÔ¼ö´Â ¸ÕÀú Á¢±Ù °¡´ÉÇÑ Ä¿³Î ¿ÀºêÁ§Æ®ÀÎÁö È®ÀÎ ÈÄ Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ µ¥ÀÌŸ¿¡¼ usage count ¸¦ 1 °¨¼Ò ½ÃŲ´Ù. ±×¸®°í ÀÌ °ªÀÌ 0 ÀÏ °æ¿ì Ä¿³Î ¿ÀºêÁ§Æ®¸¦ ¸Þ¸ð¸®¿¡¼ Á¦°ÅÇÑ´Ù.
ÇÏÁö¸¸ À߸øµÈ ÇÚµéÀ» Àü´ÞÇÒ °æ¿ì CloseHandle() ÇÔ¼ö´Â FALSE °ªÀ» ¹ÝȯÇϰí GetLastError() ÇÔ¼ö´Â ERROR_INVALID_HANDLE (6) °ªÀ» ¹ÝȯÇÏ°Ô µÈ´Ù.
±×¸®°í Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ ÇÚµéÀ» ´ÝÁö ¾Ê°í ÇÁ·Î¼¼½º°¡ Á¾·áÇÒ °æ¿ì ¸Þ¸ð¸® ´©¼ö¿¡ ´ëÇÏ¿© ¿ì·ÁÇÒ ÇÊ¿ä¾ø´Ù. ÇÁ·Î¼¼½º°¡ Á¾·áÇÒ °æ¿ì ½Ã½ºÅÛÀÌ ÀÚµ¿ÀûÀ¸·Î ÇÚµé Å×À̺íÀ» °Ë»öÇÏ¿© ÇÚµéÀ» ´Ý´Â °úÁ¤À» ¼öÇàÇÑ´Ù.
3 Sharing Kernel Objects Across Process Boundaries #
¼·Î ´Ù¸¥ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ °øÀ¯ÇØ¾ß ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ÀÌ·± °æ¿ì ´ÙÀ½°ú °°Àº Ä¿³Î ¿ÀºêÁ§Æ®°¡ »ç¿ëµÈ´Ù.
- File-mapping objects ´Â ÇϳªÀÇ ÄÄÇ»ÅÍ¿¡¼ ´Ù¸¥ ÇÁ·Î¼¼½º °£¿¡ µ¥ÀÌŸ ºí·°À» °øÀ¯ÇÏ´Â °ÍÀ» Çã¿ëÇÏ´Ù.
- Mailslots °ú Named pipes ´Â ¼·Î ´Ù¸¥ ÄÄÇ»ÅÍ °£¿¡ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ µ¥ÀÌŸ ºí·°À» °øÀ¯ÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù.
- Mutexs ¿Í Semaphores, Events ´Â ¼·Î ´Ù¸¥ ÇÁ·Î¼¼½º°£¿¡ µ¿±âÈ¿¡ »ç¿ëµÇ¸ç ÀÌ °æ¿ì ´Ù¸¥ ÇÁ·Î±×·¥¿¡°Ô ÀÛ¾÷ÀÌ ¿Ï·áµÇ¾úÀ½À» ¾Ë±â À§ÇØ »ç¿ëµÇ±âµµ ÇÑ´Ù.
Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀº ÇÁ·Î¼¼½º¿Í °ü·ÃµÇ¾î ÀÖÀ¸¹Ç·Î º¹ÀâÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀ» ¾ÈÀüÇÏ°í Æ°Æ°ÇÏ°Ô ( robustness ) °ü¸®Çϱâ À§Çؼ ÀÌ¿Í °°ÀÌ Ã³¸®µÈ´Ù. ¸¸¾à Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀ» ½Ã½ºÅÛ Àü¿ª °ªÀ¸·Î °ü¸®µÉ °æ¿ì ¾î¶°ÇÑ ÇÁ·Î¼¼½º¶óµµ ¼Õ½±°Ô ÇÚµéÀ» ȹµéÇÒ ¼ö ÀÖ´Ù. ±×¸®°í º¸¾È»óÀÇ ¾ÈÀüÀ» À§ÇÏ¿© ÀÌ¿Í °°ÀÌ Ã³¸®µÈ´Ù. Ä¿³Î ¿ÀºêÁ§Æ®´Â »ý¼º½Ã Á¢±Ù ±ÇÇÑÀ» ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç ÇÁ·Î¼¼½º¿¡¼ Á¢±ÙÇϱâ Àü¿¡ Á¢±Ù±ÇÇÑÀ» È®ÀÎÀ» ¿ä±¸Çϱ⠶§¹®ÀÌ´Ù.
3.1 Object Handle Inheritance #
¿ÀºêÁ§Æ® ÇÚµé »ó¼ÓÀº ºÎ¸ð-ÀÚ½Ä °ü°è¸¦ °®´Â ÇÁ·Î¼¼½º »çÀÌ¿¡¼¸¸ °¡´ÉÇÏ´Ù. Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀ» ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÒ ¶§ ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼ »ó¼Ó¿©ºÎ¸¦ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °áÁ¤Àº ¿©·¯°¡Áö °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù.
ù¹øÂ°, ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÒ ¶§ ¿ÀºêÁ§Æ® ÇÚµé »ó¼ÓÀÌ °¡´ÉÇϵµ·Ï ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÇÏÁö¸¸ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ó¼ÓÇÏ´Â °ÍÀÌ ¾Æ´Ï¸ç Ä¿³Î ¿ÀºêÁ§Æ® Çڵ鸸À» »ó¼ÓÇϵµ·Ï ÁöÁ¤µÉ»ÓÀÌ´Ù.
Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµé »ó¼ÓÀº ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼ SECURITY_ATTRIBUTES ±¸Á¶Ã¼¸¦ ÇÒ´çÇÑ ÈÄ ÃʱâÈ ÇÏ¿© Create* ÇÔ¼ö·Î Àü´ÞÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â Mutex ¿ÀºêÁ§Æ®¸¦ »ó¼Ó °¡´ÉÇϵµ·Ï »ý¼º ÇÑ´Ù.
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( sa );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE; // Make the returned handle inheritable.
HANDLE hMutex = CreateMutex( &sa, FALSE, NULL );
...
ÀÌ ¿¹Á¦¿¡¼´Â ±âº» º¸¾È ¼³Á¤À¸·Î »ç¿ëÇÏ¸ç »ó¼Ó°¡´ÉÇϵµ·Ï SECURITY_ATTRIBUTES ±¸Á¶Ã¼¸¦ ÃʱâÈ ÇÏ¿´´Ù.
ÁÖÀÇ> Windows 98 ¿¡¼´Â º¸¾È ¼³Á¤ÀÌ ¹«½ÃµÈ´Ù.
ÇÁ·Î¼¼½º ÇÚµé Å×ÀÌºí¿¡´Â ÇÚµé »ó¼ÓÀ» ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï °¢ Çڵ鿡 ´ëÇÏ¿© Ç÷¡±×¿¡ »ó¼Ó ¼³Á¤ ºñÆ®¸¦ °®°í ÀÖ´Ù. PSECURITY_ATTRIBUTES Àμö¿¡ NULL °ªÀ» Àü´ÞÇÏ¿© Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÒ °æ¿ì »ó¼ÓÀÌ ºÒ°¡´ÉÇÑ ÇÚµéÀ» ¹ÝȯÇϸç Ç÷¡±×ÀÇ »ó¼Ó ºñÆ® ¶ÇÇÑ 0 À¸·Î ¼³Á¤µÈ´Ù. Áï, bInheritHandle À» TRUE °ªÀ¸·Î ¼³Á¤ÇÒ °æ¿ì Ç÷¡±×ÀÇ »ó¼Ó ºñÆ®°¡ 1 ·Î ¼³Á¤µÈ´Ù.
ÇÁ·Î¼¼½º ÇÚµé Å×ÀÌºí¿¡ ´ÙÀ½°ú °°ÀÌ 2 °³ÀÇ ÇÚµéÀÌ ÀÖ´Ù°í °¡Á¤ÇÒ °æ¿ì
<Ç¥ 2> 2 °³ÀÇ À¯È¿ÇÑ ÇÚµéÀ» °®°í ÀÖ´Â ÇÁ·Î¼¼½º ÇÚµé Å×À̺í
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0xF0000000 | 0x???????? | 0x00000000 |
| 2 | 0x00000000 | (N/A) | (N/A) |
| 3 | 0xF0000010 | 0x???????? | 0x00000001 |
<Ç¥ 2> ÀÇ 2°³ÀÇ ÇÚµé ( ÇÚµé 1 °ú 3 ) Áß¿¡¼ ÇÚµé 1 Àº »ó¼ÓÇÒ ¼ö ¾øÀ¸¸ç ÇÚµé 3 Àº »ó¼Ó °¡´ÉÇÏ´Ù.
µÎ¹øÂ°, »ó¼ÓµÈ ÇÚµéÀ» »ç¿ëÇÒ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. CreateProcess() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ÀÌ °úÁ¤À» ¼öÇàÇÑ´Ù.
BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES pszThread,
BOOL bInheritHandles,
DWORD dwCreationFlags,
PVOID pvEnvironment,
PCTSTR pszCurrentDirectory,
LPSTARTUPINFO pStartupInfo,
PPROCESS_INFORMATION pProcessInformation
);
ÀÌ ÇÔ¼öÀÇ ¿©·¯°³ÀÇ Àμö Áß¿¡¼ bInheritHandles Àμö¿¡ ´ëÇÏ¿© ÁÖ¸ñÇØ¾ß ÇÑ´Ù. ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÒ ¶§ ÀϹÝÀûÀ¸·Î FALSE °ªÀ» Àü´ÞÇÑ´Ù. ÀÌ °ªÀº ºÎ¸ð ÇÁ·Î¼¼½º ÇÚµé Å×À̺íÀÇ ÇÚµé »ó¼ÓÀ» ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ÇÒ ¼ö ¾øµµ·Ï ½Ã½ºÅÛ¿¡ ¾Ë·ÁÁØ´Ù.
±×·¯³ª ÀÌ Àμö¸¦ TRUE °ªÀ¸·Î Àü´ÞÇÏ°Ô µÇ¸é ºÎ¸ðÀÇ »ó¼Ó°¡´ÉÇÑ ÇÚµéÀ» ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô »ó¼ÓÇÏ°Ô µÈ´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º°¡ »ý¼ºµÉ ¶§ ´Ù¸¥ ÇÁ·Î¼¼½º¿Í ¸¶Âù°¡Áö·Î ÇÁ·Î¼¼½º ÇÚµé Å×À̺íÀÌ ¸¸µé¾îÁö°í ÃʱâÈ µÇÁö¸¸ bInheritHandles Àμö¸¦ TRUE °ªÀ¸·Î Àü´ÞÇÏ°Ô µÇ¸é ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ÇÚµé Å×ÀÌºí¿¡¼ »ó¼Ó°¡´ÉÇÑ ÇÚµéÀ» ºÎ¸ð ÇÁ·Î¼¼½º ÇÚµé Å×À̺í°ú ¶È°°Àº À§Ä¡¿¡ º¹»çÇÏ°Ô µÈ´Ù.
±×¸®°í ÇÚµé Å×À̺íÀ» º¹»çÇÒ ¶§ ½Ã½ºÅÛ¿¡¼´Â Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ usage count ¸¦ 1 Áõ°¡ÇÏ°Ô µÈ´Ù. µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇϱ⠶§¹®¿¡ usage count °¡ Áõ°¡ÇÏ°Ô µÇ´Â °ÍÀÌ´Ù. µû¶ó¼ µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡ ¸ðµÎ CloseHandle() ÇÔ¼ö¸¦ È£ÃâÇÒ °æ¿ì Ä¿³Î ¿ÀºêÁ§Æ®°¡ Á¦°ÅµÈ´Ù.
<Ç¥ 3> Àº ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ±â ÀüÀÇ ÇÁ·Î¼¼½º ÇÚµé Å×À̺í·Î ÇÚµé 3 ¸¸ »ç¿ë°¡´ÉÇÏ´Ù. À̰ÍÀº ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ »ó¼Ó°¡´ÉÇÑ Çڵ鸸 º¹»çµÇ¾ú±â ¶§¹®ÀÌ´Ù. ¸¸¾à ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ ¶Ç ´Ù¸¥ ÀÚ½Ä ÇÁ·Î¼¼½º ( ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ¼ÕÀÚ ÇÁ·Î¼¼½º ) ¸¦ »ý¼ºÇÑ´Ù¸é ¶È°°Àº ÇÚµé Å×À̺íÀ» º¹»çÇÏ°Ô µÇ¸ç Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ usage count µµ Áõ°¡ÇÏ°Ô µÈ´Ù.
<Ç¥ 3> ºÎ¸ð ÇÁ·Î¼¼½º·Î ºÎÅÍ »ó¼Ó°¡´ÉÇÑ ÇÚµéÀ» »ó¼ÓÇÑ ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ ÇÚµé Å×À̺í
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0x00000000 | (N/A) | (N/A) |
| 2 | 0x00000000 | (N/A) | (N/A) |
| 3 | 0xF0000010 | 0x???????? | 0x00000001 |
ÇÚµé »ó¼ÓÀº ÀÚ½Ä ÇÁ·Î¼¼½º°¡ »ý¼ºµÉ ¶§¸¸ Àû¿ëµÇ´Â °ÍÀ¸·Î ÀÚ½Ä ÇÁ·Î¼¼½º°¡ »ý¼ºµÈ ÈÄ »ó¼Ó°¡´ÉÇÑ »õ·Î¿î Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÒ °æ¿ì ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô´Â »ó¼ÓµÇÁö ¾Ê´Â´Ù.
ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ÇÚµé »ó¼ÓÀ» ÇÑ °æ¿ì, ¾î¶² ÇÚµéÀÌ »ó¼ÓµÇ¾ú´ÂÁö¸¦ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù.
°¡Àå ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î Command-line À» ÀÌ¿ëÇÏ¿© ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ Àü´ÞÇÏ´Â °ÍÀÌ´Ù ( sscanf() ÇÔ¼ö ÀÌ¿ë ). ±×¸®°í IPC ¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù ( WaitForInputIdle() ÇÔ¼ö ÀÌ¿ë ). ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î ȯ°æ º¯¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀ¸·Î ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ È¯°æº¯¼ö¸¦ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ ´Ü¼øÈ÷ GetEnvironmentVariable() ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ȯ°æ º¯¼ö´Â ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô »ó¼ÓµÇ¹Ç·Î ÁÁÀº ¹æ¹ýÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù.
3.2 Changing a Handle's Flags #
°£È¤, 2 °³ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º Áß¿¡¼ ÇϳªÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô¸¸ ÇÚµé »ó¼ÓÀÌ ÇÊ¿äÇÑ °æ¿ì°¡ ÀÖÀ» °ÍÀÌ´Ù. Áï, ÀÌ·± °æ¿ì Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀÇ »ó¼ÓÀ» Á¦¾îÇϱâ À§ÇÏ¿© Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀÇ »ó¼Ó Ç÷¡±×¸¦ º¯°æÇØ¾ß ÇÑ´Ù. ÀÌ·± °æ¿ì SetHandleInformation() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ó¸®ÇÑ´Ù.
BOOL SetHandleInformation(
HANDLE hObject,
DWORD dwMask,
DWORD dwFlags
);
ÀÌ ÇÔ¼ö´Â 3 °³ÀÇ Àμö¸¦ °¡Áö°í ÀÖÀ¸¸ç ù¹øÂ° hObject Àμö´Â ¿ÀºêÁ§Æ® ÇÚµé °ªÀ̰í, µÎ¹øÂ° dwMask Àμö´Â º¯°æÇϱ⸦ ¿øÇÏ´Â Ç÷¡±× °ªÀÌ´Ù. ÀÌ Ç÷¡±× °ªÀº ´ÙÀ½°ú °°´Ù.
#define HANDLE_FLAG_INHERIT 0x00000001
#define HANDLE_FLAG_PROTECT_FROM_CLOSE 0x00000002
µÎ Ç÷¡±×´Â OR ¿¬»êÀ¸·Î °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, SetHandleInformation() ÇÔ¼öÀÇ ¼¼¹øÂ° dwFlags Àμö´Â ¼³Á¤ÇؾßÇÒ Ç÷¡±× °ªÀ» ÁöÁ¤ÇÑ´Ù. ¿¹¸¦ µé¾î Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀÇ »ó¼ÓÀ» Çã¿ëÇÒ °æ¿ì ´ÙÀ½°ú °°´Ù.
SetHandleInformation( hobj, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT );
»ó¼ÓÀ» Çã¿ëÇÏÁö ¾ÊÀ» °æ¿ì
SetHandleInformation( hobj, HANDLE_FLAG_INHERIT, 0 );
HANDLE_FLAG_PROTECT_FROM_CLOSE Ç÷¡±×´Â ÇÚµéÀ» ´ÝÀ» ¼ö ¾øµµ·Ï ½Ã½ºÅÛ¿¡°Ô ¾Ë¸°´Ù.
SetHandleInformation( hobj, HANDLE_FLAG_PROTECT_FROM_CLOSE,
HANDLE_FLAG_PROTECT_FROM_CLOSE );
CloseHandle( hobj ); // Exception is raised
´ÝÀ» ¼ö ¾øµµ·Ï ÁöÁ¤µÈ ÇÚµéÀ» ´ÝÀ» °æ¿ì CloseHandle() ÇÔ¼ö´Â ¿¹¿Ü¸¦ ¹ß»ý ½ÃŲ´Ù. ÇÏÁö¸¸ °£È¤ ÇÚµéÀ» ´ÝÁö ¸øÇϵµ·Ï ÇØ¾ßÇÒ °æ¿ì°¡ ÀÖ´Ù. ¸¸¾à ¼ÕÀÚ ÇÁ·Î¼¼½º±îÁö »ó¼Ó µÇ¾î¾ß ÇÒ ÇÚµéÀ» ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ ¼ÕÀÚ ÇÁ·Î¼¼½º°¡ »ý¼ºµÇ±â Àü¿¡ ´Ý°Ô µÇ¸é »ó¼ÓµÇÁö ¾ÊÀ¸¹Ç·Î ÇÚµéÀ» ´ÝÀ» ¼ö ¾øµµ·Ï ÁöÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
±×·¯³ª ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ HANDLE_FLAG_PROTECT_FROM_CLOSE Ç÷¡±×¸¦ ÇØÁ¦Çϰí SetHandleInformation() ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÇ¸é ÇÚµéÀ» ´ÝÀ» ¼ö ÀÖ´Ù.
SetHandleInformation( hobj, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0 );
CloseHandle( hobj );
ÀÌ·¯ÇÑ Ç÷¡±×ÀÇ º¯°æÀ» GetHandleInformation() ÇÔ¼ö¸¦ ÅëÇÏ¿© È®ÀÎÇÒ ¼ö ÀÖ´Ù.
BOOL GetHandleInformation(
HANDLE hObj,
PDWORD pdwFlags
);
ÀÌ ÇÔ¼ö´Â ÁöÁ¤µÈ Çڵ鿡 ´ëÇÑ ÇöÀç Ç÷¡±× °ªÀ» ¹ÝȯÇÑ´Ù. ¿¹¸¦ µé¾î ÇÚµéÀÇ »ó¼Ó ¿©ºÎ¸¦ ´ÙÀ½°ú °°ÀÌ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
DWORD dwFlags;
GetHandleInformation( hObj, &dwFlags );
BOOL fHandleIsInheritable = ( 0 != ( dwFlags & HANDLE_FLAG_INHERIT ) );
ÇÁ·Î¼¼½º °£¿¡ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ °øÀ¯Çϱâ À§ÇÑ µÎ¹øÂ° ¹æ¹ýÀ¸·Î Named ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ¸¹Àº ¼öÀÇ Ä¿³Î ¿ÀºêÁ§Æ®´Â Name À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº Ä¿³Î ¿ÀºêÁ§Æ® »ý¼º ÇÔ¼öµéÀº Named Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.
HANDLE CreateMutex(
PSECURITY_ATTRIBUTES psa,
BOOL bInitialOwner,
PCTSTR pszName
);
HANDLE CreateEvent(
PSECURITY_ATTRIBUTES psa,
BOOL bManualReset,
BOOL bInitialState,
PCTSTR pszName
);
HANDLE CreateSemaphore(
PSECURITY_ATTRIBUTES psa,
LONG lInitialCount,
LONG lMaximumCount,
PCTSTR pszName
);
HANDLE CreateWaitableTimer(
PSECURITY_ATTRIBUTES psa,
BOOL bManualReset,
PCTSTR pszName
);
HANDLE CreateFileMapping(
HANDLE hFile,
PSECURITY_ATTRIBUTES psa,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
PCTSTR pszName
);
HANDLE CreateJobObject(
PSECURITY_ATTRIBUTES psa,
PCTSTR pszName
);
ÀÌ ÇÔ¼öµéÀº °øÅëÀûÀ¸·Î ¸¶Áö¸· Àμö·Î pszName À» °®°í ÀÖ´Ù. ÀÌ Àμö¸¦ NULL °ªÀ¸·Î Àü´ÞÇÏ°Ô µÇ¸é Unnamed ( Anonymous ) Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ°Ô µÈ´Ù. Unnamed ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ °æ¿ì, ¼·Î ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ ¿ÀºêÁ§Æ®¸¦ °øÀ¯Çϱâ À§Çؼ´Â »ó¼ÓÀ» Çϰųª DuplicateHandle() ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¯³ª Named ¿ÀºêÁ§Æ®´Â ¿ÀºêÁ§Æ® À̸§À» ÀÌ¿ëÇÏ¿© °øÀ¯ÇÒ ¼ö ÀÖ´Ù.
³Î¹®ÀÚ ( '\0' ) ·Î ³¡³ª´Â ¹®ÀÚ¿À» pszName Àμö·Î Àü´ÞÇϸé Named ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. Name Àº ÃÖ´ë MAX_PATH ( 260 À¸·Î Á¤ÀǵǾî ÀÖÀ½ ) ±æÀÌ ¸¸Å »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾Æ½±°Ôµµ Microsoft ¿¡¼´Â Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ Name À» ÇÒ´çÇÏ´Â °Í¿¡ ´ëÇÑ ¾î¶°ÇÑ ¹æ¹ýµµ Á¦°øÇÏÁö ¾Ê´Â´Ù. Áï, µ¿ÀÏÇÑ Name ÀÌ Á¸ÀçÇÏ´ÂÁö¿¡ ´ëÇÑ È®ÀÎÀ» ÇÒ ¼ö ¾ø´Ù. °Ô´Ù°¡ ÇϳªÀÇ Name space ¸¦ °øÀ¯Çϱ⠶§¹®¿¡ ´ÙÀ½°ú °°Àº ¿¹¿¡¼ CreateSemaphore() ÇÔ¼ö´Â NULL °ªÀ» ¹ÝȯÇÑ´Ù.
HANDLE hMutex = CreateMutex( NULL, FALSE, "JeffObj" );
HANDLE hSem = CreateSemaphore( NULL, 1, 1, "JeffObj" );
DWORD dwErrorCode = GetLastError();
À§ÀÇ Äڵ带 ½ÇÇàÇÑ ÈÄ dwErrorCode º¯¼ö´Â ERROR_INVALID_HANDLE (6) °ªÀ» ¹Ýȯ¹Þ°Ô µÈ´Ù. ±×·¯³ª ÀÌ ¿¡·¯ ÄÚµå´Â ¹«¾ùÀÌ À߸øµÇ¾ú´ÂÁö ¾Ë ¼ö ¾ø´Ù. ¿©±â¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀÌ ¾ø±â ¶§¹®ÀÌ´Ù.
´ÙÀ½ ÄÚµå¿Í °°ÀÌ ÇÁ·Î¼¼½º A ¸¦ ½ÇÇàÇÏ¿´À» °æ¿ì
HANDLE hMutexProcessA = CreateMutex( NULL, FALSE, "JeffMutex" );
ÀÌ ÄÚµå´Â JeffMutex ¶ó´Â »õ·Î¿î Mutex Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù. ¿©±â¼ ÇÁ·Î¼¼½º A ÀÇ hMutexProcessA ¸¦ »ó¼ÓÇÒ ÇÊ¿ä´Â ¾ø´Ù. Named ¿ÀºêÁ§Æ®´Â ±×·² Çʿ䰡 ¾ø±â ¶§¹®ÀÌ´Ù.
±×¸®°í ³ ÈÄ, ÇÁ·Î¼¼½º B ¸¦ »ý¼ºÇÑ´Ù. ¿©±â¼ ÇÁ·Î¼¼½º B ´Â ÇÁ·Î¼¼½º A ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½ºÀÏ ÇÊ¿ä´Â ¾ø´Ù. À̰ÍÀº »ó¼Ó ´ë½Å¿¡ Named ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ´Â ÀÌÁ¡ÀÌ´Ù. ÇÁ·Î¼¼½º B ´Â ´ÙÀ½°ú Äڵ带 ½ÇÇàÇÑ´Ù.
HANDLE hMutexProcessB = CreateMutex( NULL, FALSE, "JeffMutex" );
ÇÁ·Î¼¼½º B °¡ CreateMutex() ÇÔ¼ö¸¦ È£Ãâ ÇÒ °æ¿ì, ½Ã½ºÅÛÀº ¸ÕÀú JeffMutex ¶ó´Â ¿ÀºêÁ§Æ®°¡ Á¸Á¦ÇÏ´ÂÁö °Ë»öÇÑ´Ù. ¿ÀºêÁ§Æ®°¡ Á¸ÀçÇÏ¸é µ¿ÀÏÇÑ ¿ÀºêÁ§Æ® ŸÀÔÀÎÁö È®ÀÎÇÏ°í ¿ÀºêÁ§Æ®ÀÇ Security ¸¦ °Ë»çÇÏ¿© ÇÔ¼ö¸¦ È£ÃâÇÑ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÒ ¼ö ÀÖ´ÂÁö °Ë»çÇÑ´Ù. ÀÌ °úÁ¤À» Åë°úÇÏ¿´À» ¶§ ½Ã½ºÅÛÀº ÇÁ·Î¼¼½º B ÀÇ ÇÚµé Å×ÀÌºí¿¡¼ ºñ¾îÀÖ´Â °÷À» ã¾Æ¼ ½Ã½ºÅÛ¿¡ Á¸ÀçÇÏ´Â Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ ÇÚµéÀ» ÃʱâÈ ÇÑ´Ù. ¸¸¾à ¸ðµç °ÍÀÌ ÀÏÄ¡ÇÏÁö ¾ÊÀ» °æ¿ì Ä¿³Î ¿ÀºêÁ§Æ®¸¦ Á¢±ÙÇÒ ¼ö ¾øÀ¸¸ç CreateMutex() ÇÔ¼ö´Â ½ÇÆÐÇÑ´Ù ( NULL °ªÀ» ¹Ýȯ ).
ÇÁ·Î¼¼½º B °¡ CreateMutex() ÇÔ¼ö È£ÃâÀ» ¼º°øÇÏ¿´À» ¶§, Mutex ¿ÀºêÁ§Æ®¸¦ ½ÇÁ¦·Î »ý¼ºµÇ´Â °ÍÀÌ ¾Æ´Ï´Ù. ±× ´ë½Å ÇÁ·Î¼¼½º B ´Â Ä¿³Î ³»¿¡ Á¸ÀçÇÏ´Â Mutex ¿ÀºêÁ§Æ®¸¦ ½Äº°ÇÒ ¼ö ÀÖ´Â ÇÚµé °ª¸¸À» ÇÒ´ç¹ÞÀ» »ÓÀÌ´Ù. ¹°·Ð, ÇÁ·Î¼¼½º B ÀÇ ÇÚµé Å×ÀÌºí¿¡¼ ÂüÁ¶Çϰí Àֱ⠶§¹®¿¡ Mutex ¿ÀºêÁ§Æ®ÀÇ usage count ´Â Áõ°¡ÇÑ´Ù. Áï ÇÁ·Î¼¼½º A ¿Í B °¡ ¸ðµÎ ÇÚµéÀ» ´Ý±â Àü±îÁö´Â ¿ÀºêÁ§Æ®´Â Á¦°ÅµÇÁö ¾Ê´Â´Ù. ±×¸®°í µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ Á¶ÀÛÇÏ´õ¶óµµ ¼·ÎÀÇ ÇÚµé °ªÀº µ¿ÀÏÇÏÁö ¾Ê´Ù´Â °ÍÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.
Âü°í
Name À» °øÀ¯ÇÏ´Â Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÒ ¶§ ¸Å¿ì Áß¿äÇϰí ÀÚ¼¼È÷ ¾Ë¾Æ¾ßÇÒ °ÍÀÌ ÀÖ´Ù. ÇÁ·Î¼¼½º B °¡ CreateMutex() ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ µÎ¹øÂ° Àμö¿¡ Security Attribute Á¤º¸¸¦ Àü´ÞÇÒ °æ¿ì, ¿ÀºêÁ§Æ® Name ÀÌ Á¸ÀçÇϸé ÀÌ Àμö´Â ¹«½ÃµÈ´Ù. ÀÌ·± °æ¿ì ÀÀ¿ë ÇÁ·Î±×·¥Àº »õ·Î¿î Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ´Â °Í°ú Create*() ÇÔ¼ö¸¦ È£ÃâÇÑ ÈÄ GetLastError() ÇÔ¼ö È£ÃâÇÏ¿© ÀÌ¹Ì Á¸ÀçÇÏ´Â ¿ÀºêÁ§Æ®¸¦ ´Ü¼øÈ÷ ¿©´Â °Í Áß¿¡¼ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.
HANDLE hMutex = CreateMutex( &sa, FALSE, "JeffObj" );
if( GetLastError() == ERROR_ALREADY_EXISTS ) {
// Opened a handle to an existing object.
// sa.lpSecurityDescriptor and the second parameter
// (FALSE) are ignored.
} else {
// Created a brand new object.
// sa.lpSecurityDescriptor and the second parameter
// (FALSE) are used to construct the object.
}
Name À¸·Î ¿ÀºêÁ§Æ®¸¦ °øÀ¯Çϱâ À§ÇÑ ¹æ¹ýÀ¸·Î Create*() ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ´ë½Å¿¡ ´ÙÀ½°ú °°ÀÌ Open*() ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
HANDLE OpenEvent(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
HANDLE OpenSemaphore(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
HANDLE OpenWaitableTimer(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
HANDLE OpenFileMapping(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
HANDLE OpenJobObject(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName
);
¸ðµç ÇÔ¼öµéÀº µ¿ÀÏÇÑ ÇÁ·ÎÅäŸÀÔÀ» °®°í ÀÖ´Ù. ¸¶Áö¸· ÀμöÀÎ pszName ´Â Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ Name À» ÁöÁ¤ÇÑ´Ù. ÀÌ Àμö´Â NULL °ªÀ» Àü´ÞÇÒ ¼ö ¾øÀ¸¸ç ³Î¹®ÀÚ ( '\0' ) ·Î ³¡³ª´Â ¹®ÀÚ¿À» Àü´ÞÇØ¾ß ÇÑ´Ù. ±×¸®°í À̵é ÇÔ¼ö´Â Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ ´ÜÀÏ Name space ¿¡¼ ÀÏÄ¡ÇÏ´Â ¿ÀºêÁ§Æ®¸¦ °Ë»öÇÑ´Ù. Name °ú ÀÏÄ¡ÇÏ´Â Ä¿³Î ¿ÀºêÁ§Æ®°¡ ¾øÀ» °æ¿ì, ÀÌ ÇÔ¼öµéÀº NULL °ªÀ» ¹ÝȯÇϸç GetLastError() ÇÔ¼ö´Â ERROR_FILE_NOT_FOUND (2) °ªÀ» ¹ÝȯÇÑ´Ù. ±×·¯³ª ÁöÁ¤µÈ Name ÀÇ Ä¿³Î ¿ÀºêÁ§Æ®°¡ Á¸ÀçÇÑ´Ù¸é ¿ÀºêÁ§Æ® ŸÀÔÀÌ ÀÏÄ¡Çϰí dwDesiredAccess Àμö·Î Àü´ÞµÈ Á¢±Ù ±ÇÇÑÀ» Çã¿ëÇÑ °æ¿ì·Î ÇÔ¼ö¸¦ È£ÃâÇÑ ÇÁ·Î¼¼½º ÇÚµé Å×À̺íÀº ¾÷µ¥ÀÌÆ® µÇ°í ¿ÀºêÁ§Æ®ÀÇ usage count ´Â Áõ°¡ÇÑ´Ù. ¶ÇÇÑ ¹ÝȯµÈ ÇÚµéÀº bInheritHandle Àμö¸¦ TRUE °ªÀ¸·Î Àü´ÞÇÏ¿´´Ù¸é »ó¼Óµµ °¡´ÉÇÏ´Ù.
Create*() ÇÔ¼ö¿Í Open*() ÇÔ¼ö »çÀÌ¿¡¼ÀÇ Å« Â÷ÀÌÁ¡Àº ¿ÀºêÁ§Æ®°¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì, Create*() ÇÔ¼ö´Â ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇϰí Open*() ÇÔ¼ö´Â ´Ü¼øÈ÷ ÇÔ¼ö È£ÃâÀ» ½ÇÆÐÇÑ´Ù.
¾Õ¿¡¼ ¾ð±ÞÇßÁö¸¸, Microsoft ´Â À¯ÀÏÇÑ ¿ÀºêÁ§Æ® Name À» ¾î¶»°Ô ¸¸µå´ÂÁö¿¡ ´ëÇÑ °¡À̵å¶óÀÎÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù. Áï, ¼·Î ´Ù¸¥ µÎ ȸ»ç¿¡¼ ¸¸µç µÎ °³ÀÇ ÇÁ·Î±×·¥ÀÌ "MyObject" ¶ó´Â Name ÀÇ ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇϱâ À§ÇÏ¿© ½ÃµµÇÒ °æ¿ì ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ¿Í °°Àº ¹®Á¦¸¦ ¹æÁöÇϱâ À§Çؼ´Â ¿ÀºêÁ§Æ® Name À» GUID ¸¦ »ý¼ºÇÑ ÈÄ GUID ¹®ÀÚ¿À» »ç¿ëÇϱ⸦ ±ÇÇÑ´Ù.
Named ¿ÀºêÁ§Æ®´Â ÀϹÝÀûÀ¸·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ´Ù¼öÀÇ ÀνºÅϽº°¡ ½ÇÇàµÇ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù. À̰ÍÀº main() ¶Ç´Â WinMain() ÇÔ¼ö¿¡¼ Named ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇϱâ À§ÇÏ¿© ´Ü¼øÈ÷ Create*() ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀ¸·Î °¡´ÉÇÏ´Ù ( ¿ÀºêÁ§Æ® ŸÀÔÀÌ ÀÏÄ¡ÇÏÁö ¾Ê¾Æµµ µÈ´Ù ). Create*() ÇÔ¼ö¸¦ ½ÇÇàÇÑ ÈÄ GetLastError() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹Ýȯ°ªÀÌ ERROR_ALREADY_EXISTS ÀÏ °æ¿ì, ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÀÖ´Â »óÅÂÀ̹ǷΠ»õ·Î ½ÇÇàµÈ ÀνºÅϽº´Â Á¾·áÇÑ´Ù. ÀÌ¿Í °°Àº ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.
int WINAPI WinMain( HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine,
int nCmdShow )
{
HANDLE h = CreateMutex( NULL, FALSE,
"{FA531CC1-0497-11d3-A180-00105A276C3E}" );
if( GetLastError() == ERROR_ALREADY_EXISTS ) {
// There is already an instance of this application running.
return ( 0 );
}
// This is the first instance of this application running.
...
// Before exiting, close the object.
CloseHandle( h );
return ( 0 );
}
3.4 Terminal Service Name Spaces #
Terminal ¼¹ö´Â ¾Õ¿¡¼ º¸¾Ò´ø ½Ã³ª¸®¿À Áß¿¡¼ ÀϺκÐÀ» ¹Ù²ã¾ß ÇÑ´Ù. Terminal ¼¹ö ¸Ó½ÅÀº Ä¿³Î ¿ÀºêÁ§Æ®¸¦ À§ÇÑ ´Ù¼öÀÇ Name space °¡ ÇÊ¿äÇÏ´Ù. ±× Áß¿¡ ÇϳªÀÇ Global name space °¡ ÀÖ´Ù. À̰ÍÀº ÀϺΠ¶Ç´Â ¸ðµç Ŭ¶óÀÌ¾ðÆ® ¼¼¼Ç¿¡¼ Á¢±ÙÇÒ ¼ö ÀÖ´Â Ä¿³Î ¿ÀºêÁ§Æ®¿¡ ÀÇÇØ »ç¿ëµÇ¸ç ÁÖ·Î ¼ºñ½º¿¡ ÀÇÇÏ¿© »ç¿ëµÉ Name space °¡ µÈ´Ù. ±×¸®°í °¢ Ŭ¶óÀÌ¾ðÆ® ¼¼¼ÇÀº °¢°¢ÀÇ Name space ¸¦ °®°í ÀÖ´Ù. À̰ÍÀº µÎ°³ ¶Ç´Â ±× ÀÌ»óÀÇ ¼¼¼Ç¿¡¼ ½ÇÇàµÇ´Â °°Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ º¸È£ÇÑ´Ù. Áï, °°Àº Name À¸·Î °øÀ¯µÇ´Â ¿ÀºêÁ§Æ®¶óµµ ¼·Î ´Ù¸¥ ¼¼¼Ç¿¡¼´Â Á¢±ÙÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù. Terminal ¼¹ö¸¦ Á¦°øÇÏÁö ¾Ê´Â ¸Ó½Å¿¡¼´Â ¼ºñ½º¿Í ÀÀ¿ë ÇÁ·Î±×·¥Àº ¾Õ¿¡¼ º¸¾Ò´ø °Í°ú °°ÀÌ µ¿ÀÏÇÑ Ä¿³Î ¿ÀºêÁ§Æ® Name space ¸¦ °øÀ¯ÇÑ´Ù. ±×·¯³ª Terminal ¼¹ö ¸Ó½Å¿¡¼´Â µ¿ÀÏÇÏÁö ¾Ê´Ù.
¼ºñ½ºÀÇ Named Ä¿³Î ¿ÀºêÁ§Æ®´Â ¾ðÁ¦³ª Global name space ³»¿¡ ÀÖ´Ù. ±âº»ÀûÀ¸·Î Terminal ¼¹ö ³»¿¡ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Named Ä¿³Î ¿ÀºêÁ§Æ®´Â Session name space ³»¿¡ ÀÖ´Ù. ±×·¯³ª "Global\" ¸¦ Name ¾Õ¿¡ ºÙÀÌ°Ô µÇ¸é Ä¿³Î ¿ÀºêÁ§Æ®¸¦ Global name space ¿¡ °Á¦ÀûÀ¸·Î ³ÖÀ» ¼ö ÀÖÀ¸¸ç ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.
HANDLE h = CreateEvent( NULL, FALSE, FALSE, "Global\\MyName" );
¶ÇÇÑ "Local\" ¸¦ Name ¾Õ¿¡ ºÙÀÓÀ¸·Î¼ ¸í½ÃÀûÀ¸·Î Ä¿³Î ¿ÀºêÁ§Æ®¸¦ Session Name space ¿¡ ³ÖÀ» ¼ö ÀÖ´Ù. ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
HANDLE h = CreateEvent( NULL, FALSE, FALSE, "Local\\MyName" );
Microsoft ´Â Global °ú Local À» ƯÁ¤ÇÑ Name space ¸¦ Á¦¿ÜÇÑ ¿ÀºêÁ§Æ® Name À¸·Î »ç¿ëÇÒ ¼ö ¾øµµ·Ï ¿¹¾à¾î·Î ÁöÁ¤ÇÏ´Â °ÍÀ» °í·ÁÇϰí ÀÖ´Ù. ¶ÇÇÑ ÇöÀç ÀǹÌÇÏ´Â °ÍÀº ¾øÁö¸¸ Session µµ ¿¹¾à¾î·Î ÁöÁ¤ÇÏ´Â °ÍÀ» °í·ÁÁßÀÌ´Ù. ÁÖÀÇÇÒ °ÍÀº ÀÌµé ¿¹¾à¾î´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸º°Çϸç, ³¡À¸·Î Terminal Server °¡ ½ÇÇàµÇÁö ¾Ê´Â ¸Ó½Å¿¡´Â ÀÌµé ¿¹¾à¾î´Â ¹«½ÃµÈ´Ù.
3.5 Duplicating Object Handles #
¼·Î ´Ù¸¥ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ °øÀ¯ÇÏ´Â ¸¶Áö¸· ¹æ¹ýÀ¸·Î DuplicateHandle() ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
PHANDLE phTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);
´Ü¼øÈ÷, ÀÌ ÇÔ¼ö´Â ÇϳªÀÇ ÇÁ·Î¼¼½º ÇÚµé Å×À̺íÀÇ ÇÚµéÀ» ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ÇÚµé Å×À̺í·Î º¹»çÇÑ´Ù. DuplicateHandle() ÇÔ¼ö´Â ¿©·¯°³ÀÇ Àμö¸¦ °¡Áö°í ÀÖÁö¸¸ ½ÇÁ¦·Î ¾ÆÁÖ °£´ÜÇÏ´Ù. ÀÌ ÇÔ¼öÀÇ °¡Àå ÀϹÝÀûÀÎ »ç¿ë¹ýÀº ½Ã½ºÅÛ¿¡¼ ½ÇÇàÁßÀÎ 3 °³ÀÇ ¼·Î ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
DuplicateHandle() ÇÔ¼öÀÇ Ã¹¹øÂ°¿Í ¼¼¹øÂ° Àμö ( hSourceProcessHandle ¿Í hTargetProcessHandle ) ´Â Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀ̸ç ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÇÁ·Î¼¼½º¿Í °ü·ÃµÈ ÇÚµéÀÌ´Ù. °Ô´Ù°¡ ÀÌ µÎ °³ÀÇ Àμö´Â ÇÁ·Î¼¼½º ŸÀÔÀÇ Ä¿³Î ¿ÀºêÁ§Æ®·Î DuplicateHandle() ÇÔ¼öÀÇ È£ÃâÀÌ ½ÇÆÐÇÏ¿´À» °æ¿ì, ´Ù¸¥ ŸÀÔÀÇ Ä¿³Î ¿ÀºêÁ§Æ®°¡ Àü´ÞµÇ¾ú´ÂÁö È®ÀÎÇØ º¸¾Æ¾ß ÇÑ´Ù.
µÎ¹øÂ° ÀμöÀÎ hSourceHandle ´Â ´Ù¾çÇÑ Å¸ÀÔÀÇ Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀÌ °¡´ÉÇÏ´Ù. ±×·¯³ª ÀÌ ÇÚµé °ªÀº DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÇÁ·Î¼¼½º¿Í °ü·ÃµÈ °ÍÀÌ ¾Æ´Ï´Ù. ±× ´ë½Å¿¡ hSourceProcessHandle Çڵ鿡 ÀÇÇÏ¿© ½Äº°µÇ´Â ÇÁ·Î¼¼½º¿Í °ü·ÃµÇ¾î ÀÖ´Ù. ³×¹øÂ° ÀμöÀÎ phTargetHandle ´Â Source ÀÇ ÇÚµé Á¤º¸¸¦ º¹»çÇÑ Target ÇÚµé Å×À̺íÀÇ À妽º¸¦ ¹Þ±â À§ÇÑ HANDLE º¯¼öÀÇ ÁÖ¼Ò·Î hTargetProcessHandle Çڵ鿡 ÀÇÇÏ¿© ½Äº°µÇ´Â ÇÁ·Î¼¼½º¿Í °ü·ÃµÈ ÇÚµé °ªÀ» ¹Þ°Ô µÈ´Ù.
DuplicateHandle() ÇÔ¼öÀÇ ¸¶Áö¸· 3 °³ÀÇ Àμö´Â access mask °ª°ú »ó¼ÓÀ» ¼³Á¤ÇÏ´Â Ç÷¡±× °ª, ±×¸®°í ¿É¼ÇÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù. dwOptions Àμö´Â 0 ¶Ç´Â µÎ °³ÀÇ Ç÷¡±× ( DUPLICATE_SAME_ACCESS ¿Í DUPLICATE_CLOSE_SOURCE ) ¸¦ Á¶ÇÕÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù.
DUPLICATE_SAME_ACCESS ¸¦ ÁöÁ¤Çϸé Source ÇÁ·Î¼¼½ºÀÇ ÇÚµé°ú µ¿ÀÏÇÑ access mask °ªÀ» Target ÇÚµé·Î º¹»çÇϵµ·Ï DuplicateHandle() ÇÔ¼ö¿¡°Ô ¾Ë·ÁÁØ´Ù. ÀÌ Ç÷¡±×¸¦ »ç¿ëÇϸé dwDesiredAccess Àμö´Â ¹«½ÃµÈ´Ù.
DUPLICATE_CLOSE_SOURCE ¸¦ ÁöÁ¤Çϸé Source ÇÁ·Î¼¼½º¿¡¼ ÇÚµéÀ» ´ÝÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù. À̰ÍÀº ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ »ç¿ëµÇ´Â Ä¿³Î ¿ÀºêÁ§Æ®¸¦ ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼ °ü¸®Çϱ⠽±µµ·Ï ¸¸µç´Ù. ÀÌ Ç÷¡±×¸¦ »ç¿ëÇÏ°Ô µÇ¸é Ä¿³Î ¿ÀºêÁ§Æ®ÀÇ Usage count ÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù.
DuplicateHandle() ÇÔ¼ö°¡ ¾î¶»°Ô 󸮵ǴÂÁö ¿¹¸¦ ÅëÇÏ¿© ¾Ë¾Æº¸ÀÚ. ¿©±â¼ ÇÁ·Î¼¼½º S ´Â Source ÇÁ·Î¼¼½º·Î ÇöÀç Ä¿³Î ¿ÀºêÁ§Æ®¸¦ °®°í ÀÖ´Ù. ±×¸®°í ÇÁ·Î¼¼½º T ´Â Target ÇÁ·Î¼¼½º·Î Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀ» ¾ò¾î¾ß ÇÑ´Ù. ÇÁ·Î¼¼½º C ´Â DuplicateHandle() ÇÔ¼ö È£ÃâÀ» ½ÇÇàÇÒ Catalyst ÇÁ·Î¼¼½ºÀÌ´Ù.
ÇÁ·Î¼¼½º C ÀÇ ÇÚµé Å×À̺í ( Ç¥ 4 ) ´Â 2 °³ÀÇ ÇÚµé °ª ( 1 °ú 2 ) ¸¦ °®°í ÀÖ´Ù. ÇÚµé °ª 1 °ú 2 ´Â °¢°¢ ÇÁ·Î¼¼½º S ¿Í ÇÁ·Î¼¼½º T ÀÇ ÇÁ·Î¼¼½º ŸÀÔÀÇ Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµé °ªÀÌ´Ù.
<Ç¥ 4> ÇÁ·Î¼¼½º C ÀÇ ÇÚµé Å×À̺í
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0xF0000000 (Process S's kernel object) | 0x???????? | 0x00000000 |
| 2 | 0xF0000010 (Process T's kernel object) | 0x???????? | 0x00000000 |
<Ç¥ 5> ´Â ÇÁ·Î¼¼½º S ÀÇ ÇÚµé Å×À̺íÀ̸ç ÇϳªÀÇ ÇÚµé °ª 2 ¸¦ °®°í ÀÖ´Ù. ÀÌ ÇÚµéÀº ¾î¶² ŸÀÔÀÇ Ä¿³Î ¿ÀºêÁ§Æ®µµ °¡´ÉÇϸç ÇÁ·Î¼¼½º ŸÀÔÀÇ ¿ÀºêÁ§Æ® ÇÚµéÀÏ ÇÊ¿ä´Â ¾ø´Ù.
<Ç¥ 5> ÇÁ·Î¼¼½º S ÀÇ ÇÚµé Å×À̺í
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0x00000000 | (N/A) | (N/A) |
| 2 | 0xF0000020 (any kernel object) | 0x???????? | 0x00000000 |
<Ç¥ 6> Àº ÇÁ·Î¼¼½º C °¡ DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇϱâ ÀüÀÇ ÇÁ·Î¼¼½º T ÀÇ ÇÚµé Å×À̺íÀÌ´Ù. ÀÌ Å×À̺íÀº ÇϳªÀÇ ÇÚµé °ª 2 ¸¸À» °®°í ÀÖÀ¸¸ç, ÇÚµé 1 Àº »ç¿ëÇÏÁö ¾Ê°í ÀÖ´Ù.
<Ç¥ 6> DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü, ÇÁ·Î¼¼½º T ÀÇ ÇÚµé Å×À̺í
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0x00000000 | (N/A) | (N/A) |
| 2 | 0xF0000030 (any kernel object) | 0x???????? | 0x00000000 |
ÇÁ·Î¼¼½º C °¡ ´ÙÀ½°ú °°Àº ÄÚµå·Î DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇÒ °æ¿ì, <Ç¥ 7> °ú °°ÀÌ ÇÁ·Î¼¼½º T ÀÇ ÇÚµé Å×ÀÌºí¸¸ ¹Ù²î°Ô µÈ´Ù.
DuplicateHandle(1, 2, 2, &hObj, 0, TRUE, DUPLICATE_SAME_ACCESS);
<Ç¥ 7> DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇÑ ÈÄ, ÇÁ·Î¼¼½º T ÀÇ ÇÚµé Å×À̺í
| Index | Pointer to Kernel Object Memory Block | Access Mask (DWORD of Flag Bits) | Flags (DWORD of Flag Bits) |
| 1 | 0xF0000020 | 0x???????? | 0x00000001 |
| 2 | 0xF0000030 (any kernel object) | 0x???????? | 0x00000000 |
ÇÁ·Î¼¼½º S ÀÇ ÇÚµé Å×À̺íÀÇ ÇÚµé 2 °¡ ÇÁ·Î¼¼½º T ÀÇ ÇÚµé Å×À̺íÀÇ ÇÚµé 1 ·Î º¹»çµÈ´Ù. ¶ÇÇÑ DuplicateHandle() ÇÔ¼ö´Â ÇÁ·Î¼¼½º C ÀÇ
hObj º¯¼ö·Î ÇÁ·Î¼¼½º T ÀÇ ÇÚµé Å×ÀÌºí¿¡ »õ·Ó°Ô ÇÒ´çµÈ ÇÚµé °ª 1 À» ¹ÝȯÇÑ´Ù.
±×¸®°í DuplicateHandle() ÇÔ¼ö¿¡ DUPLICATE_SAME_ACCESS Ç÷¡±×¸¦ Àü´ÞÇÏ¿´±â ¶§¹®¿¡ ÇÁ·Î¼¼½º S ÀÇ ÇÚµé°ú µ¿ÀÏÇÑ access mask °ªÀ» ÇÁ·Î¼¼½º T ÀÇ Çڵ鿡 ¼³Á¤µÇ¾ú´Ù. ¶ÇÇÑ DUPLICATE_SAME_ACCESS Ç÷¡±×¸¦ Àü´ÞÇÏ¿´À¸¹Ç·Î dwDesiredAccess Àμö´Â ¹«½ÃµÈ´Ù. ¸¶Áö¸·À¸·Î bInheritHandle Àμö¿¡ TRUE °ªÀ» Àü´ÞÇϱ⠶§¹®¿¡ »ó¼Ó °¡´ÉÇϵµ·Ï Ç÷¡±×°¡ ¼³Á¤µÇ¾ú´Ù.
À§ÀÇ ¿¹¿¡¼ º¸¾Ò´ø °Í°ú °°ÀÌ Çϵå ÄÚµùµÇ¾î ÀÖ´Â °ªÀ» DuplicateHandle() ÇÔ¼öÀÇ Àμö·Î Àü´ÞÇϸé Àý´ë ¾ÈµÈ´Ù. ÀÌ °ªµéÀº ´ÜÁö ÀÌ ÇÔ¼ö°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ¾Ë¾Æº¸±â À§ÇÏ¿© ¿¹¸¦ µé¾úÀ» »ÓÀÌ´Ù. µû¶ó¼ ½ÇÁ¦ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼´Â º¯¼ö¸¦ ÀÌ¿ëÇÏ¿© ´Ù¾çÇÑ ÇÚµé °ªÀ» DuplicateHandle() ÇÔ¼ö·Î Àü´ÞÇØ¾ß ÇÒ °ÍÀÌ´Ù.
»ó¼Ó°ú °°ÀÌ DuplicateHandle() ÇÔ¼öÀÇ ÀÌ»óÇÑ °Í Áß Çϳª´Â »õ·Î¿î Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» Target ÇÁ·Î¼¼½º¿¡°Ô ¾Ë·ÁÁÖÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î ÇÁ·Î¼¼½º C ´Â hObj º¯¼öÀÇ ÇÚµé °ªÀ» IPC ( Inter Process Communication ) ¿Í °°Àº °ÍÀ» ÀÌ¿ëÇÏ¿© ÇÁ·Î¼¼½º T ¿¡°Ô »õ·Î¿î Ä¿³Î ¿ÀºêÁ§Æ® ÇÚµé »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ºÐ¸íÇÑ °ÍÀº ÀÌ¹Ì ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ°í ÀÖÀ¸¹Ç·Î command-line À̳ª ÇÁ·Î¼¼½º T ÀÇ È¯°æ º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. µû¶ó¼ Window message ³ª ´Ù¸¥ IPC ¸ÞÄ«´ÏÁòÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.
¿©±â¼´Â ´ÜÁö DuplicateHandle() ÇÔ¼öÀÇ °¡Àå ÀϹÝÀûÀÎ »ç¿ë¹æ¹ý¿¡ ´ëÇÏ¿© ¼³¸íÇÏ¿´´Ù. ÀÌ ÇÔ¼ö´Â ´ë´ÜÈ÷ À¯¿¬ÇÑ ÇÔ¼öÁö¸¸ 3 °³ÀÇ ÇÁ·Î¼¼½º°¡ ¿¬°üµÈ °æ¿ì´Â ´ë´ÜÈ÷ µå¹°´Ù ( ÇÁ·Î¼¼½º S °¡ »ç¿ëÇϰí ÀÖ´Â ÇÚµé °ªÀ» ÇÁ·Î¼¼½º C °¡ ¾Ë°í ÀÖ´Ù´Â °ÍÀº ´ë´ÜÈ÷ ¾î·Á¿î ÀÏÀ̱⠶§¹®ÀÌ´Ù ). ÀϹÝÀûÀ¸·Î DuplicateHandle() ÇÔ¼ö´Â ¼·Î ¿¬°ü ÀÖ´Â µÎ °³ÀÇ ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© »ç¿ëµÈ´Ù. ´Ù¸¥ ÇÁ·Î¼¼½º°¡ °®°í ÀÖ´Â Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇØ¾ß Çϰųª ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Ä¿³Î ¿ÀºêÁ§Æ®¸¦ Àü´ÞÇØ¾ß ÇÏ´Â »óȲÀ» °¡Á¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ÇÁ·Î¼¼½º S °¡ °®°í ÀÖ´Â Ä¿³Î ¿ÀºêÁ§Æ®¸¦ ÇÁ·Î¼¼½º T ·Î Àü´ÞÇÑ´Ù°í ÇÒ °æ¿ì, ´ÙÀ½°ú °°ÀÌ DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
// All of the following code is executed by Process S.
// Create a mutex object accessible by Process S.
HANDLE hObjProcessS = CreateMutex( NULL, FALSE, NULL );
// Open a handle to Process T's kernel object.
HANDLE hProcessT = OpenProcess( PROCESS_ALL_ACCESS, FALSE,
dwProcessIdT );
HANDLE hObjProcessT; // An uninitialized handle relative to Process T.
// Give Process T access to our mutex object.
DuplicateHandle( GetCurrentProcess(), hObjProcessS, hProcessT,
&hObjProcessT, 0, FALSE, DUPLICATE_SAME_ACCESS );
// Use some IPC mechanism to get the handle
// value in hObjProcessS into Process T.
...
// We no longer need to communicate with Process T.
CloseHandle( hProcessT );
...
// When Process S no longer needs to use the mutex, it should close it.
CloseHandle( hObjProcessS );
GetCurrentProcess() ÇÔ¼ö´Â ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÇÁ·Î¼¼½º¸¦ Ç×»ó È®ÀÎÇÒ ¼ö ÀÖ´Â pseudo ÇÚµéÀ» ¹ÝȯÇÑ´Ù ( À§ÀÇ ¿¹¿¡¼ ÇÁ·Î¼¼½º S ). DuplicateHandle() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹ÝȯµÈ hObjProcessT º¯¼ö´Â ÇÁ·Î¼¼½º S ¿¡¼ »ç¿ëµÇ´Â hObjProcessS º¯¼öÀÇ ÇÚµé°ú µ¿ÀÏÇÑ ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â ÇÁ·Î¼¼½º T ÀÇ ÇÚµé °ªÀ» °®°í ÀÖ´Ù. µû¶ó¼ ÇÁ·Î¼¼½º S ´Â ´ÙÀ½°ú °°Àº Äڵ带 Àý´ë·Î ½ÇÇàÇÒ ¼ö ¾ø´Ù.
// Process S should never attempt to close the
// duplicated handle.
CloseHandle( hObjProcessT );
¸¸¾à ÇÁ·Î¼¼½º S °¡ ÀÌ Äڵ带 ½ÇÇàÇÑ´Ù¸é, ¼º°øÇϰųª ½ÇÆÐÇÒ ¼öµµ ÀÖ´Ù. hObjProcessT º¯¼öÀÇ ÇÚµé °ª°ú µ¿ÀÏÇÑ Ä¿³Î ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù¸é ÇÁ·Î¼¼½º S ´Â ¼º°øÇÒ °ÍÀÌ´Ù. ±×·¯³ª À̰ÍÀº ÇÁ·Î¼¼½º S ÀÇ ¾î¶² ¿ÀºêÁ§Æ®¸¦ ´õ ÀÌ»ó »ç¿ëÇÒ ¼ö ¾øµµ·Ï ´Ý´Â °á°ú¸¦ °¡Á®¿À°Ô µÇ¹Ç·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÀÌ»óÇÏ°Ô µ¿ÀÛÇÏ°Ô µÇ´Â ¿øÀÎÀÌ µÉ ¼ö ÀÖ´Ù.
DuplicateHandle() ÇÔ¼öÀÇ ¶Ç ´Ù¸¥ »ç¿ë¹ýÀº Àбâ¿Í ¾²±â°¡ °¡´ÉÇÑ file-mapping ¿ÀºêÁ§Æ®¸¦ ÇÁ·Î¼¼½º°¡ °®°í ÀÖ´Ù°í °¡Á¤ÇÏ°í ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§, file-mapping ¿ÀºêÁ§Æ®¸¦ Àб⸸ °¡´ÉÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù. À̰ÍÀº ÀÀ¿ë ÇÁ·Î±×·¥À» º¸´Ù ¾ÈÀüÇÏ°í Æ°Æ°ÇÏ°Ô ( robust ) Çϱâ À§ÇÏ¿© DuplicateHandle() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÀÌ¹Ì Á¸ÀçÇÏ´Â ¿ÀºêÁ§Æ®¿¡ ´ëÇÏ¿© Àб⸸ °¡´ÉÇÑ »õ·Î¿î ÇÚµéÀ» ¸¸µç´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø Àбâ Àü¿ë ÇÚµéÀ» ÇÔ¼ö·Î Àü´ÞÇÑ´Ù. ÀÌ ¹æ¹ýÀº ÇÔ¼ö ³»¿¡¼ file-mapping ¿ÀºêÁ§Æ®¿¡ ´ëÇÏ¿© Àý´ë·Î ¾²±â¸¦ ÇÒ ¼ö ¾ø´Ù. ´ÙÀ½°ú °°ÀÌ ¿¹¸¦ µé ¼ö ÀÖ´Ù.
int WINAPI WinMain( HINSTANCE hinstExe, HINSTANCE,
LPSTR szCmdLine, int nCmdShow )
{
// Create a file-mapping object; the handle has read/write access.
HANDLE hFileMapRW = CreateFileMapping( INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE, 0, 10240, NULL );
// Create another handle to the file-mapping object;
// the handle has read-only access.
HANDLE hFileMapRO;
DuplicateHandle( GetCurrentProcess(), hFileMapRW, GetCurrentProcess(),
&hFileMapRO, FILE_MAP_READ, FALSE, 0 );
// Call the function that should only read from the file mapping.
ReadFromTheFileMapping( hFileMapRO );
// Close the read-only file-mapping object.
CloseHandle( hFileMapRO );
// We can still read/write the file-mapping object using hFileMapRW.
...
// When the main code doesn¡¯t access the file mapping anymore,
// close it.
CloseHandle( hFileMapRW );
}
CategoryTranslation