¼¼¸¶Æ÷¾î´Â System V IPC ÀÇ ¼³ºñÁß Çϳª·Î, ÇϳªÀÇ ÀÚ¿ø¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÏ·Á°í ÇÒ¶§, ÇØ´çÀÚ¿ø¿¡ ´ëÇÑ Á¢±ÙÁ¦¾î¸¦ Çϱâ À§ÇØ ÇÊ¿äÇÑ ¼³ºñÀÌ´Ù.
À̹ø °Á¸¦ ÅëÇؼ ¼¼¸¶Æ÷¾îÀÇ »ç¿ë¹æ¹ý¿¡ ´ëÇؼ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù.
¼¼¸¶Æ÷¾î¶õ ¹«¾ùÀΰ¡
¼¼¸¶Æ÷¾î(Semaphores)¸¦ ºñ·Ï IPC¼³ºñÁßÀÇ Çϳª·Î ºÐ·ùÇϱä ÇßÁö¸¸, ´Ù¸¥ ÆÄÀÌÇÁ, ¸Þ½ÃÁöÅ¥, FIFO µî°ú´Â Á»´Ù¸£´Ù. ´Ù¸¥ IPC ¼³ºñµéÀÌ ´ëºÎºÐ ÇÁ·Î¼¼½º°£ ¸Þ½ÃÁö Àü¼ÛÀ» ±× ¸ñÀûÀ¸·Î Çϴµ¥ ¹ÝÇؼ ¼¼¸¶Æ÷¾î´Â ÇÁ·Î¼¼½º°£ µ¥ÀÌŸ¸¦ µ¿±âÈ ÇÏ°í º¸È£Çϴµ¥ ±×¸ñÀûÀÌ ÀÖ´Ù.
ÇÁ·Î¼¼½º°£ ¸Þ½ÃÁö Àü¼ÛÀ» Çϰųª, ȤÀº °øÀ¯¸Þ¸ð¸®¸¦ ÅëÇؼ ƯÁ¤ µ¥ÀÌŸ¸¦ °øÀ¯ÇÏ°Ô µÉ°æ¿ì ¹ß»ýÇÏ´Â ¹®Á¦°¡, °øÀ¯µÈ ÀÚ¿ø¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ Á¢±ÙÀ» Çϸé¾ÈµÇ¸ç, ´ÜÁö Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±Ù °¡´ÉÇϵµ·Ï ¸¸µé¾îÁà¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ°ÍÀº ¾²·¹µå¿¡¼ ¸Þ½ÃÁö°£ µ¿±âȸ¦ À§Çؼ mutex ¸¦ »ç¿ëÇϴ°Ͱú °°Àº ÀÌÀ¯ÀÌ´Ù.
ÇϳªÀÇ µ¥ÀÌŸ¿¡ ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ °ü¿©ÇÒ¶§ ¾î¶² ¹®Á¦Á¡ÀÌ ¹ß»ýÇÒ¼ö ÀÖ´ÂÁö °£´ÜÇÑ ¿¹¸¦ µé¾îº¸µµ·Ï ÇÏ°Ú´Ù. int count=100;
A ÇÁ·Î¼¼½º°¡ count ¸¦ ÀоîµéÀδÙ. 100
B ÇÁ·Î¼¼½º°¡ count ¸¦ ÀоîµéÀδÙ. 100
B ÇÁ·Î¼¼½º°¡ count ¸¦ 1 Áõ°¡ ½ÃŲ´Ù. 101
A ÇÁ·Î¼¼½º°¡ count ¸¦ 1 Áõ°¡ ½ÃŲ´Ù. 101
count ´Â °øÀ¯ÀÚ¿ø(°øÀ¯¸Þ¸ð¸® °°Àº)À̸ç A¿Í B ÇÁ·Î±×·¥ÀÌ ¿©±â¿¡ ´ëÇÑ ÀÛ¾÷À» ÇÑ´Ù. A°¡ 1À» Áõ°¡ ½ÃÅ°°í B°¡ 1À» Áõ°¡½ÃÅ°¹Ç·Î ÃÖÁ¾ count °ªÀº 102 °¡ µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ±×·¯³ª A °¡ ÀÛ¾÷À» ¸¶Ä¡±â Àü¿¡ B°¡ ÀÛ¾÷À» ÇÏ°Ô µÊÀ¸·Î ¾û¶×ÇÑ °á°ú¸¦ º¸¿©ÁÖ°Ô µÇ¾ú´Ù. À§ÀÇ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ´Â count ¿¡ A°¡ Á¢±ÙÇÒ¶§ BÇÁ·Î¼¼½º°¡ Á¢±ÙÇÏÁö¸øÇϵµ·Ï block ½ÃÅ°°í, A°¡ ¸ðµç ÀÛ¾÷À» ¸¶ÃÆÀ»¶§ BÇÁ·Î¼¼½º°¡ ÀÛ¾÷À» ÇÒ¼ö ÀÖµµ·Ï block ¸¦ ÇØÁ¦ ½ÃÅ°¸é µÉ°ÍÀÌ´Ù.
¿ì¸®´Â ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇؼ ÀÌ·¯ÇÑ ÀÛ¾÷À» ÇÒ¼ö ÀÖ´Ù. ÇѸ¶µð·Î ÁÙ¿©¼ ¼¼¸¶Æ÷¾î´Â "¿©·¯°³ÀÇ ÇÁ·Î¼¼½º¿¡ ÀÇÇؼ °øÀ¯µÈ´Â ÀÚ¿øÀÇ Á¢±ÙÁ¦¾î¸¦ À§ÇÑ µµ±¸" ÀÌ´Ù.
¼¼¸¶Æ÷¾îÀÇ ÀÛµ¿¿ø¸®
ÀÛµ¿¿ø¸®´Â ¸Å¿ì °£´ÜÇÏ´Ù. Â÷´ÜÀ» ¿øÇÏ´Â ÀÚ¿ø¿¡´ëÇؼ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϸé ÇØ´çÀÚ¿øÀ» °¡¸®Å°´Â ¼¼¸¶Æ÷¾î °ªÀÌ ÇÒ´çµÈ´Ù. ÀÌ ¼¼¸¶Æ÷¾î °ª¿¡´Â ÇöÀç ¼¼¸¶Æ÷¾î¸¦ Àû¿ëÇÏ°í ÀÖ´Â ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ýÀÚ¸¦ ³ªÅ¸³½´Ù. ÀÌ °ªÀÌ 0À̸é ÀÌ ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ýÀÚ°¡ 0À̶ó´Â ¶æÀ̸ç, ÀÚ¿ø), 0º¸´Ù Å« Á¤¼ö¸é ÇØ´ç Á¤¼öÀÇ Å©±â¸¸ÅÀÇ ÇÁ·Î¼¼½º°¡ ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Ù¶ó´Â ¶æÀÌ µÈ´Ù. ±×·¯¹Ç·Î ¿ì¸®´Â Á¢±ÙÁ¦¾î¸¦ ÇؾßÇÏ´Â ÀÚ¿ø¿¡ Á¢±ÙÇϱâ Àü¿¡ ¼¼¸¶Æ÷¾î °ªÀ» °Ë»çÇؼ °ªÀÌ 0À̸é ÀÚ¿øÀ» »ç¿ëÇÒ¼ö ÀÖÀ»¶§±îÁö ±â´Ù¸®°í, 0º¸´Ù ´õÅ©¸é(1À̶ó°í °¡Á¤ÇÏÀÚ) ÀÚ¿ø¿¡ Á¢±ÙÇؼ ¼¼¸¶Æ÷¾î °ªÀ» 1 °¨¼Ò ½ÃÄѼ, ¼¼¸¶Æ÷¾î °ªÀ» 0À¸·Î ¸¸µé¾î¼, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÚ¿ø¿¡ Á¢±ÙÇÒ¼ö ¾øµµ·Ï ÇÏ°í, ÀÚ¿øÀÇ »ç¿ëÀÌ ³¡³ª¸é ¼¼¸¶Æ÷¾î °ªÀ» ´Ù½Ã 1Áõ°¡½ÃÄѼ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÚ¿øÀ» »ç¿ëÇÒ¼ö ÀÖµµ·Ï ¸¸µé¾îÁÖ¸é µÈ´Ù.
¸¸¾à ¼¼¸¶Æ÷¾î °ªÀ» °Ë»çÇߴµ¥ ¼¼¸¶Æ÷¾î °ªÀÌ 0À̶ó¸é »ç¿ëÇÒ¼ö ÀÖ°Ô µÉ¶§±îÁö (1ÀÌ µÉ¶§±îÁö) ±â´Ù¸®¸é (block) µÉ°ÍÀÌ´Ù.
¼¼¸¶Æ÷¾îÀÇ »ç¿ë
¼¼¸¶Æ÷¾îÀÇ »ç¿ëÀº À§ÀÇ ÀÛµ¿¿ø¸®¸¦ ±×´ë·Î Àû¿ëÇÑ´Ù. Áï 1. ¼¼¸¶Æ÷¾î·Î Á¦¾îÇÒ ÀÚ¿øÀ» ¼³Á¤ÇÑ´Ù.
2. ÇØ´ç ÀÚ¿øÀ» »ç¿ëÇϱâÀü¿¡ ¼¼¸¶Æ÷¾î °ªÀ» È®ÀÎÇÑ´Ù.
3. ¼¼¸¶Æ÷¾î °ªÀÌ 0º¸´Ù Å©¸é ÀÚ¿øÀ» »ç¿ëÇÏ°í, ¼¼¸¶Æ÷¾î °ªÀ» 1 °¨¼Ò ½ÃŲ´Ù.
4. ¼¼¸¶Æ÷¾î °ªÀÌ 0ÀÌ¸é °ªÀÌ 0º¸´Ù Ä¿Áú¶§±îÁö block µÇ¸ç, 0º¸´Ù Ä¿Áö°Ô µÇ¸é 2¹ø ºÎÅÍ ½ÃÀÛÇÏ°Ô µÈ´Ù.
À§ÀÇ ÀÛ¾÷À» À§Çؼ Unix ´Â ´ÙÀ½°ú °°Àº °ü·ÃÇÔ¼öµéÀ» Á¦°øÇÑ´Ù.
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
-
- int semget(key_t key, int nsems, int semflg);
- int semop (int semid, struct sembuf *sops, unsigned nsops);
- int semctl(int semid, int semnum, int cmd, union semun arg);
¼¼¸¶Æ÷¾îÀÇ °ü¸® ¼¼¸¶Æ÷¾î´Â ±× Ư¼º»ó ¿øÀÚÈµÈ ¿¬»êÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·¯ÇÑ ¿øÀÚÈµÈ ¿¬»êÀº À¯Àú·¹º§ÀÇ ÇÔ¼ö¿¡¼´Â Á¦°øÇϱⰡ Èûµé¹Ç·Î, ¼¼¸¶Æ÷¾î Á¤º¸´Â Ä¿³Î¿¡¼ Àü¿ë ±¸Á¶Ã¼¸¦ ÀÌ¿ëÇؼ °ü¸®ÇÏ°Ô µÈ´Ù. ´ÙÀ½Àº Ä¿³Î¿¡¼ ¼¼¸ðÆ÷¾î Á¤º¸¸¦ À¯ÁöÇϱâ À§Çؼ °ü¸®ÇÏ´Â ±¸Á¶Ã¼ÀÎ semid_ds ±¸Á¶Ã¼ÀÇ ¸ð½ÀÀÌ´Ù. semid_ds ´Â /usr/include/bits/sem.h ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. (ÀÌ°ÍÀº ¸®´ª½º¿¡¼ÀÇ °æ¿ì·Î Unix ¹öÁ¯¿¡ µû¶ó¼ À§Ä¡¿Í ¸â¹öº¯¼ö¿¡ ¾à°£¾¿ Â÷ÀÌ°¡ ÀÖÀ»¼ö ÀÖ´Ù)
- struct semid_ds
- {
- struct ipc_perm sem_perm;
- __time_t sem_otime;
- unsigned long int __unused1;
- __time_t sem_ctime;
- unsigned long int __unused2;
- unsigned long int sem_nsems;
- unsigned long int __unused3;
- unsigned long int __unused4;
- };
sem_perm Àº ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Æ۹̼ÇÀ¸·Î ÀÏ¹Ý ÆÄÀÏÆ۹̼ǰú ¸¶Âù°¡ÁöÀÇ ±â´ÉÀ» Á¦°øÇÑ´Ù. Áï ÇöÀç ¼¼¸¶Æ÷¾î ±¸Á¶Ã¼¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â »ç¿ëÀÚ±ÇÇÑÀ» ¼³Á¤ÇÑ´Ù. sem_nsems ´Â »ý¼ºÇÒ¼ö ÀÖ´Â ¼¼¸¶Æ÷¾îÀÇ Å©±âÀÌ´Ù. sem_otime Àº ¸¶Áö¸·À¸·Î ¼¼¸¶Æ÷¾î°ü·Ã ÀÛ¾÷À» ÇÑ ½Ã°£(semop ÇÔ¼ö¸¦ ÀÌ¿ë)À̸ç, sem_ctim Àº ¸¶Áö¸·À¸·Î ±¸Á¶Ã¼ Á¤º¸°¡ ¹Ù²ï ½Ã°£ÀÌ´Ù.
semget À» ÀÌ¿ëÇؼ ¼¼¸¶Æ÷¾î¸¦ ¸¸µéÀÚ. ¼¼¸¶Æ÷¾îÀÇ »ý¼ºÈ¤Àº ±âÁ¸¿¡ ¸¸µé¾îÁ® ÀÖ´Â ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇϱâ À§Çؼ À¯´Ð½º¿¡¼ ´Â semget(2)¸¦ Á¦°øÇÑ´Ù. ù¹ø° ¾Æ±Ô¸ÕÆ®´Â ¼¼¸¶Æ÷¾îÀÇ À¯ÀÏÇÑ Å°°ªÀ» À§Çؼ »ç¿ëÇÏ´Â int ÇüÀÇ Å°°ªÀÌ´Ù. ¿ì¸®´Â ÀÌ key °ªÀ» ÀÌ¿ëÇؼ À¯ÀÏÇÑ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϰųª Á¢±ÙÇÒ¼ö ÀÖ°Ô µÈ´Ù. »õ·Î »ý¼ºµÇ°Å³ª ±âÁ¸ÀÇ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇϰųª Çϴ°ÍÀº semflg ¸¦ ÅëÇؼ Á¦¾îÇÒ¼ö ÀÖ´Ù. ´ÙÀ½Àº semflg ÀÇ ¾Æ±Ô¸ÕÆ®ÀÌ´Ù.
IPC_CREAT
¸¸¾à Ä¿³Î¿¡ ÇØ´ç key °ªÀ¸·Î Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾ø´Ù¸é, »õ·Î »ý¼º ÇÑ´Ù.
IPC_EXCL
IPC_CREAT¿Í ÇÔ²² »ç¿ëÇϸç, ÇØ´ç key °ªÀ¸·Î ¼¼¸¶Æ÷¾î°¡ ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é ½ÇÆаªÀ» ¸®ÅÏÇÑ´Ù.
semflg ¸¦ ÅëÇؼ ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Æ۹̼ÇÀ» ÁöÁ¤ÇÒ¼öµµ ÀÖ´Ù. ÆÛ¹Ì¼Ç ÁöÁ¤Àº º¸ÅëÀÇ ÆÄÀÏ¿¡ ´ëÇؼ À¯Àú/±×·ì/other ¿¡ ´ëÇؼ ÁöÁ¤Çϴ°Ͱú °°´Ù.
¸¸¾à IPC_CREAT ¸¸ »ç¿ëÇÒ°æ¿ì ÇØ´ç key °ªÀ¸·Î Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾ø´Ù¸é, »õ·Î »ý¼ºÇÏ°í, ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾îÀÇ id ¸¦ ³Ñ°ÜÁØ´Ù. IPC_EXCLÀ» »ç¿ëÇϸé key °ªÀ¸·Î Á¸ÀçÇÏ´Â ¼¼¸¶Æ÷¾î°¡ ¾øÀ»°æ¿ì »õ·Î »ý¼ºµÇ°í, ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é Á¸ÀçÇÏ´Â id °ªÀ» µ¹·ÁÁÖÁö ¾Ê°í ½ÇÆаª(-1)À» µÇµ¹·ÁÁÖ°í, errno ¸¦ ¼³Á¤ÇÑ´Ù.
nsems Àº ¼¼¸¶Æ÷¾î°¡ ¸¸µé¾îÁú¼ö ÀÖ´Â Å©±âÀÌ´Ù. ÀÌ°ªÀº ÃÖÃÊ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇÏ´Â »ý¼ºÀÚÀÇ °æ¿ì¿¡ Å©±â°¡ ÇÊ¿äÇÏ´Ù(º¸Åë 1). ±×¿Ü¿¡ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇؼ »ç¿ëÇÏ´Â ¼ÒºñÀÚÀÇ °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î¸¦ ¸¸µéÁö ¾Ê°í ´ÜÁö Á¢±Ù¸¸ ÇÒ»ÓÀÓÀ¸·Î Å©±â´Â 0ÀÌ µÈ´Ù.
ÀÌ»óÀÇ ³»¿ëÀ» Á¤¸®Çϸé semget Àº ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. ¸¸¾à ÃÖÃÊ »ý¼ºÀ̶ó¸é
sem_num = 1;
±×·¸Áö ¾Ê°í ¸¸µé¾îÁø ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÏ´Â °ÍÀ̶ó¸é
sem_num = 0;
sem_id = semget(12345, sem_num, IPC_CREAT|0660)) == -1)
{
perror("semget error : ");
return -1;
}
semget Àº ¼º°øÇÒ°æ¿ì int ÇüÀÇ ¼¼¸¶Æ÷¾î Áö»çÀÚ¸¦ µÇµ¹·ÁÁÖ¸ç, ¸ðµç ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ Á¢±ÙÀº ÀÌ ¼¼¸¶Æ÷¾î Áö½ÃÀÚ¸¦ »ç¿ëÇÏ°Ô µÈ´Ù.
À§ÀÇ ÄÚµå´Â key 12345 ¸¦ ÀÌ¿ëÇؼ ¼¼¸¶Æ÷¾î¸¦ »ý¼ºÇϸç Æ۹̼ÇÀº 0660À¸·Î ¼³Á¤µÈ´Ù. ¼¼¸¶Æ÷¾îÀÇ Å©±â´Â 1·Î ÀâÇô ÀÖ´Ù(´ëºÎºÐÀÇ °æ¿ì 1). ¸¸¾à ±âÁ¸¿¡ key 12345 ·Î ÀÌ¹Ì ¸¸µé¾îÁø ¼¼¸¶Æ÷¾î°¡ ÀÖ´Ù¸é »õ·Î »ý¼ºÇÏÁö ¾Ê°í ±âÁ¸ÀÇ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ¼¼¸¶Æ÷¾î Áö½ÃÀÚ¸¦ µÇµ¹·ÁÁÖ°Ô µÇ°í, Ä¿³ÎÀº semget ¸¦ ÅëÇØ ³Ñ¾î¿Â Á¤º¸¸¦ ÀÌ¿ëÇؼ semid_ds ±¸Á¶Ã¼¸¦ ¼¼ÆÃÇÑ´Ù.
¿¹Á¦: semget.c
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
-
- int main()
- {
- int semid;
- semid = semget((key_t)12345, 1, 0666 | IPC_CREAT);
- }
ÀÌÁ¦ À§ÀÇ Äڵ带 ÄÄÆÄÀÏÇؼ ½ÇÇà½ÃÅ°°í ³ª¼ ½ÇÁ¦·Î ¼¼¸¶Æ÷¾î Á¤º¸°¡ ¾î¶»°Ô ¹Ù²î¿´´ÂÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
Ä¿³Î¿¡¼ °ü¸®µÇ´Â ipc Á¤º¸¸¦ ¾Ë¾Æº¸±â À§Çؼ´Â ipcs(8)¶ó´Â µµ±¸¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù.
[root@localhost test]# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems status
0x00003039 0 root 666 1
0x00003039 Àº key 12345 ÀÇ 16Áø¼ö Ç¥ÇöÀÌ´Ù. Æ۹̼ÇÀº 666À¸·Î µÇ¾î ÀÖ°í semget ¸¦ ÅëÇؼ Á¦´ë·Î ¼³Á¤µÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇؼ Á¢±ÙÁ¦¾î Çϱâ
ÀÌÁ¦ semget À» ÅëÇؼ ¼¼¸¶Æ÷¾î¸¦ ¸¸µé°Å³ª Á¢±ÙÇßÀ¸´Ï, ÀÌÁ¦ ½ÇÁ¦·Î ¼¼¸¶Æ÷¾î»óŸ¦ °Ë»çÇؼ Á¢±ÙÁ¦¾î¸¦ Çغ¸µµ·ÏÇÏÀÚ.
ÀÌ°ÍÀº semop¸¦ ÅëÇؼ ÀÌ·ç¾îÁø´Ù.
semop ÀÇ Ã¹¹ø° semid ´Â semget À» ÅëÇؼ ¾òÀº ¼¼¸¶Æ÷¾î Áö½ÃÀÚÀÌ´Ù. 2¹ø° ¾Æ±Ô¸ÕÆ®´Â struct sembuf ·Î½á, ¾î¶² ¿¬»êÀ» ÀÌ·ç¾îÁö°Ô ÇÒ·±Áö °áÁ¤Çϱâ À§Çؼ »ç¿ëµÈ´Ù. ±¸Á¶Ã¼ÀÇ ³»Àº ´ÙÀ½°ú °°À¸¸ç, sys/sem.h ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
- struct sembuf
- {
- short sem_num;
- short sem_op;
- short sem_flg;
- }
sem_num ¸â¹ö´Â ¼¼¸¶Æ÷¾îÀÇ ¼ö·Î ¿©·¯°³ÀÇ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é(Áï ¹è¿ÀÌ ¾Æ´Ò°æ¿ì) 0À» »ç¿ëÇÑ´Ù. ¹è¿ÀÇ À妽º »çÀÌÁî¶ó°í »ý°¢ÇÏ¸é µÉ°ÍÀÌ´Ù. º¸ÅëÀÇ °æ¿ì ÇϳªÀÇ ¼¼¸¶Æ÷¾î¸¦ ÁöÁ¤Çؼ »ç¿ëÇϹǷΠ0 ÀÌ µÉ°ÍÀÌ´Ù.
sem_op ¸¦ ÀÌ¿ëÇؼ ½ÇÁúÀûÀ¸·Î ¼¼¸¶Æ÷¾î ¿¬»êÀ» ÇÏ°Ô µÇ¸ç, ÀÌ°ÍÀ» ÀÌ¿ëÇؼ ¼¼¸¶Æ÷¾î °ªÀ» Áõ°¡½ÃÅ°°Å³ª °¨¼Ò ½Ãų¼ö ÀÕ´Ù. sem_op °ªÀÌ ¾ç¼öÀÏ °æ¿ì´Â ÀÚ¿øÀ» ´Ù ½èÀ¸´Ï, ¼¼¸¶Æ÷¾î °ªÀ» Áõ°¡½ÃÅ°°Ú´Ù´Â ¶æÀ̸ç, À½¼öÀÏ °æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ°ÍÀ» ¿äûÇÑ´Ù¶ó´Â ¶æÀÌ´Ù. À½¼öÀÏ °æ¿ì ¼¼¸¶Æ÷¾î°ªÀÌ ÃæºÐÇÏ´Ù¸é ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÒ¼ö ÀÖÀ¸¸ç, Ä¿³ÎÀº ¼¼¸¶Æ÷¾îÀÇ °ªÀ» À½¼öÀÇ Å©±âÀÇ Àý´ë°ª¸¸ÅÀ» ¼¼¸¶Æ÷¾î¿¡¼ »©ÁØ´Ù. ¸¸¾à ¼¼¸¶Æ÷¾îÀÇ °ªÀÌ ÃæºÐÇÏÁö ¾Ê´Ù¸é ¼¼¹ø° ¾Æ±Ô¸ÕÆ®ÀÎ sem_flg ¿¡ µû¶ó¼ ÇൿÀÌ °áÁ¤µÇ´Âµ¥,
sem_flg °¡ IPC_NOWAIT·Î ¸í½ÃµÇ¾î ÀÖ´Ù¸é, Çش翵¿ª¿¡¼ ±â´Ù¸®Áö ¾Ê°í(none block) ¹Ù·Î ¿¡·¯Äڵ带 ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾Ê´Ù¸é ¼¼¸¶Æ÷¾î¸¦ ȹµæÇÒ¼ö ÀÖÀ»¶§±îÁö block µÇ°Ô µÈ´Ù. sem_flg ´Â IPC_NOWAIT ¿Í SEM_UNDO 2°³ÀÇ ¼³Á¤ÇÒ¼ö ÀÖ´Â °ªÀ»°¡Áö°í ÀÖ´Ù. IPC_NOWAIT ´Â none block ¸ðµå ÁöÁ¤À» À§Çؼ »ç¿ëµÇ¸ç, SEM_UNDO ´Â ÇÁ·Î¼¼½º°¡ ¼¼¸¶Æ÷¾î¸¦ µ¹·ÁÁÖÁö ¾Ê°í Á¾·áÇعö¸±°æ¿ì Ä¿³Î¿¡¼ ¾Ë¾Æ¼ ¼¼¸¶Æ÷¾î °ªÀ» Á¶Á¤(Áõ°¡) ÇÒ¼ö ÀÖµµ·Ï ¸¸µé¾î ÁØ´Ù.
¼³¸íÀÌ ¾Æ¸¶ ¾Ö¸Å¸ðÈ£ÇѸéÀÌ ÀÖÀ»°ÍÀÌ´Ù. °£´ÜÇÑ »óȲÀ» ¿¹·Î µé¾î¼ ¼³¸íÇØ º¸°Ú´Ù. ÇöÀç ¼¼¸¶Æ÷¾î °ªÀÌ 1 À̶ó°í °¡Á¤ÇÏÀÚ.
À̶§ A ÇÁ·Î¼¼½º°¡ semop ¸¦ ÅëÇؼ ¼¼¸¶Æ÷¾î¿¡ Á¢±ÙÀ» ½ÃµµÇÑ´Ù.
A´Â Á¢±ÙÀ» À§Çؼ sem_op ¿¡ -1 À» ¼¼ÆÃÇÑ´Ù. Áï ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» 1 ¸¸Å »ç¿ëÇÏ°Ú´Ù¶ó´Â
¶æÀÌ´Ù.
ÇöÀç ÁغñµÈ ¼¼¸¶Æ÷¾î °ªÀº 1·Î Áï½Ã »ç¿ëÇÒ¼ö ÀÖÀ¸¹Ç·Î,
A´Â ÀÚ¿øÀ» »ç¿ëÇÏ°Ô µÇ¸ç, Ä¿³ÎÀº ¼¼¸¶Æ÷¾î °ªÀ» 1 ¸¸Å °¨¼Ò½ÃŲ´Ù.
À̶§ B ¶ó´Â ÇÁ·Î¼¼½º°¡ ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» 1 ¸¸Å »ç¿ëÇÏ°Ú´Ù¶ó°í ¿äûÀ» ÇÑ´Ù.
±×·¯³ª Áö±Ý ¼¼¸¶Æ÷¾î °ªÀº 0 À̹ǷΠB´Â Áö±Ý´çÀå ¼¼¸¶Æ÷¾î ¸¦ »ç¿ëÇÒ¼ö ¾øÀ¸¸ç,
±â´Ù¸®°Å³ª, ¿¡·¯°ªÀ» ¸®ÅÏ ¹Þ¾Æ¾ß ÇÑ´Ù(IPC_NOWAIT).
B´Â ÀÚ¿ø »ç¿ë°¡´ÉÇÒ¶§±îÁö ±â´Ù¸®±â·Î °áÁ¤À» Çß´Ù.
Àá¼öÈÄ A´Â ¸ðµç ÀÛ¾÷À» ´Ù¸¶ÃÆ´Ù.
ÀÌÁ¦ ¼¼¸¶Æ÷¾î¸¦ µÇµ¹·ÁÁà¾ß ÇÑ´Ù. sem_op ¿¡ 1 À» ¼¼ÆÃÇϸé,
Ä¿³ÎÀº ¼¼¸¶Æ÷¾î °ªÀ» 1Áõ°¡½ÃÅ°°Ô µÈ´Ù.
µåµð¾î ±â´Ù¸®´ø B°¡ ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» »ç¿ëÇÒ¼ö ÀÖ´Â ¶§°¡ µµ·¡Çß´Ù.
ÀÌÁ¦ ¼¼¸¶Æ÷¾î °ªÀº 1ÀÌ ¹Ç·Î B´Â ¼¼¸¶Æ÷¾î¸¦ ȹµæÇÏ°Ô µÈ´Ù.
Ä¿³ÎÀº ¼¼¸¶Æ÷¾î °ªÀ» 1 °¨¼Ò ½ÃŲ´Ù.
B´Â ¿øÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù.
...
...
¼¼¸¶Æ÷¾î Á¶ÀÛ semctl À̶õ ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ ¿ì¸®´Â ¼¼¸¶Æ÷¾î¸¦ Á¶Á¤ÇÒ¼ö ÀÖ´Ù. semctl Àº semid_ds ±¸Á¶Ã¼¸¦ º¯°æÇÔÀ¸·Î½á ¼¼¸¶Æ÷¾îÀÇ Æ¯¼ºÀ» Á¶Á¤ÇÑ´Ù.
ù¹ø° ¾Æ±Ô¸ÕÆ®ÀÎ semid ´Â ¼¼¸¶Æ÷¾î Áö½ÃÀÚÀÌ´Ù. semnum Àº ¼¼¸¶Æ÷¾î ¹è¿À» ´Ù·ê °æ¿ì »ç¿ëµÇ¸ç, º¸ÅëÀº 0ÀÌ´Ù. cmd ´Â ¼¼¸¶Æ÷¾î Á¶ÀÛ¸í·É¾î ¼ÂÀ¸·Î ´ÙÀ½°ú °°Àº Á¶ÀÛ¸í·É¾îµéÀ» °¡Áö°í ÀÖ´Ù. ¾Æ·¡´Â ±×Áß Áß¿äÇÏ´Ù°í »ý°¢µÇ´Â °Íµé¸¸À» ¼³¸íÇÏ¿´´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº semctl ¿¡ ´ëÇÑ man ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
IPC_STAT
¼¼¸¶Æ÷¾î »óÅ°ªÀ» ¾ò¾î¿À±â À§ÇØ »ç¿ëµÇ¸ç, »óÅ°ªÀº arg ¿¡ ÀúÀåµÈ´Ù.
IPC_RMID
¼¼¸¶Æ÷¾î ¸¦ »èÁ¦Çϱâ À§Çؼ »ç¿ëÇÑ´Ù.
IPC_SET
semid_ds ÀÇ ipc_perm Á¤º¸¸¦ º¯°æÇÔÀ¸·Î½á ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ ±ÇÇÑÀ» º¯°æÇÑ´Ù.
¿¹Á¦¸¦ ÅëÇÑ ÀÌÇØ
Áö±Ý±îÁö ÀÍÇû´ø ³»¿ëÀ» Åä´ë·Î °£´ÜÇÑ ¿¹Á¦ÇÁ·Î±×·¥À» ¸¸µé¾îº¸°Ú´Ù. ¿¹Á¦ÀÇ »óȲÀº ÇϳªÀÇ ÆÄÀÏ¿¡ 2°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ Á¢±ÙÇÏ°íÀÚ Çϴµ¥¿¡¼ ¹ß»ýÇÑ´Ù. ÆÄÀÏ¿¡´Â count ¼ýÀÚ°¡ µé¾î ÀÖÀ¸¸ç, ÇÁ·Î¼¼½º´Â ÆÄÀÏÀ» ¿¾î¼ count ¼ýÀÚ¸¦ ÀоîµéÀÌ°í, ¿©±â¿¡ 1À» ´õÇؼ ´Ù½Ã ÀúÀåÇÏ´Â ÀÛ¾÷À»ÇÑ´Ù. ÀÌ°ÍÀ» ¼¼¸¶Æ÷¾î¸¦ ÅëÇؼ Á¦¾îÇÏÁö ¾ÊÀ¸¸é À§¿¡¼ ¼³¸íÇѹ®Á¦°¡ ¹ß»ýÇÒ°ÍÀÌ´Ù.
À§ÀÇ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ´Â ÆÄÀÏÀ» ¿±âÀü¿¡ ¼¼¸¶Æ÷¾î¸¦ ¼³Á¤Çؼ Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±Ù°¡´ÉÇϵµ·Ï ÇÏ¸é µÉ°ÍÀÌ´Ù. ¸ðµç ÆÄÀÏÀÛ¾÷À» ¸¶Ä¡°Ô µÇ¸é, ¼¼¸¶Æ÷¾î ÀÚ¿øÀ» µ¹·ÁÁÜÀ¸·Î½á, ºñ·Î¼ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±Ù°¡´ÉÇÏ°Ô ¸¸µé¾î¾ß ÇÑ´Ù.
¿¹Á¦: sem_test
- #include <sys/types.h>
- #include <sys/sem.h>
- #include <sys/ipc.h>
- #include <stdio.h>
- #include <unistd.h>
-
- #define SEMKEY 2345
-
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short int *array;
- };
-
- static int semid;
- int main(int argc, char **argv)
- {
- FILE* fp;
- char buf[11];
- char count[11];
-
- union semun sem_union;
-
-
- struct sembuf mysem_open = {0, -1, SEM_UNDO};
- struct sembuf mysem_close = {0, 1, SEM_UNDO};
- int sem_num;
-
- memset(buf, 0x00, 11);
- memset(count, 0x00, 11);
-
-
-
- if (argc > 1)
- sem_num = 1;
- else
- sem_num = 0;
-
-
- semid = semget((key_t)234, sem_num, 0660|IPC_CREAT);
- if (semid == -1)
- {
- perror("semget error ");
- exit(0);
- }
-
-
- if(semop(semid, &mysem_open, 1) == -1)
- {
- perror("semop error ");
- exit(0);
- }
-
- if ((fp = fopen("counter.txt", "r+")) == NULL)
- {
- perror("fopen error ");
- exit(0);
- }
-
- fgets(buf, 11, fp);
- rewind(fp);
-
-
- buf[strlen(buf) - 1] = 0x00;
-
- sprintf(count, "%d\n", atoi(buf) + 1);
- printf("%s", count);
-
- sleep(10);
- fputs(count,fp);
-
- fclose(fp);
-
- semop(semid, &mysem_close, 1);
- return 1;
- }
ÄÚµå´Â ¸Å¿ì °£´ÜÇÏÁö¸¸, ¼¼¸¶Æ÷¾î¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇظ¦ ÃæºÐÈ÷ ÇÒ¼ö ÀÖÀ»¸¸ÇÑ ÄÚµåÀÌ´Ù. »ý¼ºÀÚ¿Í ¼ÒºñÀÚÀÇ ºÐ¸®´Â ÇÁ·Î±×·¥¿¡ ³Ñ°ÜÁö´Â ¾Æ±Ô¸ÕÆ®¸¦ ÀÌ¿ëÇß´Ù. ¸ðµç ÀÛ¾÷À» ¸¶Ä¡¸é Å×½ºÆ®¸¦ À§Çؼ 10Ãʸ¦ ±â´Ù¸°ÈÄ¿¡ ¼¼¸¶Æ÷¾î¸¦ µ¹·ÁÁÖµµ·Ï ÄÚµùµÇ¾î ÀÖ´Ù.
¿ì¼± count ¸¦ ÀúÀåÇÒ ÆÄÀÏ counter.txt ¸¦ ¸¸µé°í ¿©±â¿¡´Â 1À» ÀúÀåÇØ ³õ´Â´Ù. ±×´ÙÀ½ ./sem_test ¸¦ ½ÇÇà½ÃÅ°´Âµ¥, ÃÖÃÊ¿¡´Â »ý¼ºÀÚ¸¦ ¸¸µé¾î¾ß ÇϹǷΠ¾Æ±Ô¸ÕÆ®¸¦ ÁÖ¾î¼ ½ÇÇà½ÃÅ°°í, ±×´ÙÀ½¿¡ ½ÇÇà½Ãų¶§´Â ¼ÒºñÀÚ°¡ µÇ¹Ç·Î ¾Æ±Ô¸ÕÆ® ¾øÀÌ ½ÇÇàÇϵµ·Ï ÇÏÀÚ. ´ÙÀ½Àº Å×½ºÆ® ¹æ¹ýÀÌ´Ù.
[root@coco test]# ./sem_test 1&
[1] 3473
36
[root@coco test]# ./sem_test
À§ Äڵ带 ½ÇÇàÇغ¸¸é ./sem_test 1 ÀÌ ¼¼¸¶Æ÷¾îÀÚ¿øÀ» µ¹·ÁÁÖ±â Àü±îÁö ./sem_test °¡ Çش翵¿ª¿¡¼(¼¼¸¶Æ÷¾î ¿äûÇÏ´Â ºÎºÐ) ºí·°µÇ¾î ÀÖÀ½À» ¾Ë¼ö ÀÖ°í, Ãæµ¹¾øÀÌ count°¡ ÀߵǴ°ÍÀ» º¼¼ö ÀÖÀ»°ÍÀÌ´Ù.
¼¼¸¶Æ÷¾î´Â Ä¿³Î¿¡¼ °ü¸®Çϴµ¥ ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º°¡ ¾ø´Ù°í ÇÏ´õ¶óµµ semctl À» ÀÌ¿ëÇؼ Á¦°ÅÇÏÁö ¾Ê´ÂÇÑÀº Ä¿³Î¿¡ ³²¾ÆÀÖ°Ô µÈ´Ù. ¼¼¸¶Æ÷¾î Á¤º¸¸¦ Á¦°ÅÇϱâ À§Çؼ´Â semctl ¿¬»êÀ» ÇϵçÁö, ÄÄÇ»Å͸¦ ¸®º× ½ÃÄ¿°Å³ª, ipcrm(8)À̶õ µµ±¸¸¦ »ç¿ëÇؼ Á¦°Å½ÃÄÑ Áà¾ß ÇÑ´Ù.
°á·Ð
¼¼¸¶Æ÷¾î´Â fcntl °ú ¸Å¿ì ºñ½ÁÇÑ ÀÏÀ» ¼öÇàÇϴµ¥, Á»´õ ¼¼¹ÐÇÑ Á¶Á¤ÀÌ °¡´ÉÇÏ´Ù¶ó´Â ÀåÁ¡À» °¡Áö°í ÀÖÁö¸¸ °£´ÜÇÑ ÀÏÀ» Çϱ⿣ Áö³ªÄ¡°Ô º¹ÀâÇÑ ¸éÀÌ ¾øÀÝ¾Æ ÀÖ´Ù. ÀÌ·²°æ¿ì¿¡´Â ¼¼¸¶Æ÷¾î ´ë½Å fcntl À» »ç¿ëÇÏÀÚ.
fcntl Àº ±âȸ°¡ µÇ´Âµ¥·Î ´Ù·çµµ·Ï ÇÏ°Ú´Ù.