<title>Unix overview CHAP11</title>



     11

         




    稥  堭  ⢨   ந ᠬ -
 ⢫  묨  ᨭ஭஢ ᢮ 믮  㣨-
 ᠬ.  㦥 ᬮ५ ᪮쪮   ⢨  ᮢ,
⠪    쭠  ,  ᯮ짮    뫪
ᨣ.  ()  ⮪, 易    ⥬,  
  ⮫쪮 ⮬ , 맢襣 ⥬ 㭪 pipe: 
騥 த⢥ 痢    ⢮  ᮡ 
    .  ᬮ  ,   
 ⢮  ᮡ ᠬ,    騬  த⢥
痢,    ᯮ짮    (.  13),   ࣠-
樨 ⢥ 痢  ࠧ묨 㯯  -
ᮢ:      ⠪ ⨯஢,  -
஬     ᮢ   ᢮ 뤥  -
. ந   ⠪ 뢠  ᮡ  -
뫪  ᨣ     ⥬ 㭪樨 kill,  ⠪ "ᮮ饭"
⮨   ⮫쪮  ᨣ.
       뢠 㣨  ⢨ ᮢ.   -
砫       ஢ ᮢ,  ⮬,  ࠧ  
᫥  室 믮 㣮  ,  ⥬  ᬠਢ  
IPC:  ᮮ饭,  ࠧ塞   ᥬ.   ࠤ樮
⮤ ⥢ ⢨ ᮢ, 믮  ࠧ  設,
,  ,   ।⠢  "", ਬ  ⥬ BSD.
 ⥢ ⢨, 騥  ᯥ樠  ࠪ,  ⠪  
⮪,      .,   ᬠਢ, ᪮  室 
ࠬ 饩 ࠡ.


        11.1  

     ⥬ UNIX  ⥩ ଠ  ⢨  ᮢ,  -
㥬   楫 ⫠, - ஢ ᮢ. -⫠稪, -

     +-------------------------------------------------------+
     | if ((pid = fork()) == 0)                              |
     | {                                                     |
     |     /* ⮬ - 㥬  */              |
     |     ptrace(0,0,0,0);                                  |
     |     exec(" 㥬 ");               |
     | }                                                     |
     | /* த 믮 -⫠稪 */       |
     | for (;;)                                              |
     | {                                                     |
     |     wait((int *) 0);                                  |
     |     read(室 ଠ  ஢ )   |
     |     ptrace(cmd,pid,...);                              |
     |     if (᫮ 襭 ஢)               |
     |          break;                                       |
     | }                                                     |
     +-------------------------------------------------------+

             㭮 11.1.   ⫠

                                    330



ਬ sdb, ஦ 㥬   ࠢ  믮   -
  ⥬  㭪樨  ptrace, ⠢  뢠 ஫ 窨,
뢠  뢠    㠫쭮 ᭮ ࠭⢮. -
஢ ᮢ, ⠪ ࠧ, 砥    ᥡ  ᨭ஭  믮
-⫠稪  㥬   ࠢ 믮 ᫥-
.
    ᥢணࠬ, ।⠢  㭪 11.1,  ⨯ -
  ⫠筮 ணࠬ. ⫠稪 ஦  , ᪠騩 -
⥬ 㭪 ptrace,  १ 祣  ᮮ⢥饩  -⮬
 ⠡ ᮢ  ⠭  ஢. -⮬
।祭  ᪠ (exec) 㥬 ணࠬ. ਬ, ᫨ -
⥫  ⫠ ணࠬ a.out, -⮬ ᪠ 䠩  ⥬
  .  ࠡ뢠 㭪 exec  浪,   䨭 -
砥,   ஢ ⠭,  뫠  -⮬  ᨣ
뢠.  室  㭪樨 exec,    室   㣮 㭪-
樨,  ஢ 稥 ᨣ, 㦨 ⮫쪮  ᫠ ᨣ-
  뢠  ᯮ ணࠬ ஢   ᮡ 砩
ࠡ⪨ ᨣ. ⨢ ⠭  ஢, -⮬  -
 ᢮ த⥫  ﭨ ਮ⠭,  ஬ ᫥ 室-
  ᫥⢨ ᯮ 㭪樨 wait, ᠬ 室  ﭨ ஢-
,  ﭨ ਮ⠭ (    ࠬ  ﭨ
, . 㭮 6.1),  믮 ४祭 ⥪.
     ६  筮 樨 -த⥫ (⫠稪) 室 
짮⥫᪨ ஢,  祭   㥬 -
.    ᮮ⢥饥  ⨥ ᮬ-த⥫ 㤥 祭, 
멤  ﭨ  (wait), ⠥ (read)   짮-
     ॢ    饭  㭪樨 ptrace, ࠢ
஢ -⮬. ⠪ 맮 ⥬ 㭪樨 ptrace:

    ptrace(cmd,pid,addr,data);

  ⢥ cmd 㪠뢠 ࠧ , ਬ,  ⥭  ,
  ,  믮  .., pid - 䨪 -
㥬 , addr - 㠫  祩   㥬  ,
 㤥 ந ⥭  , data - 楫 祭, ।-
祭   .  ६ ᯮ ⥬ 㭪樨 ptrace  ஢-
,    ⫠稪 ⮬  䨪஬ pid    室  
 ⮬  ﭨ ஢, ᫥ 祣   -
 , ।祭  ।    ᠬ. ⮡
㣨  , 믮騥 ஢,    ᮤন ⮩
,   ஬,  뢠   ࠬ cmd,  addr
  data,  -⮬, ॢ   ﭨ "⮢
 믮"  ਮ⠭  祭   ⢥.    -
-⮬ த ᢮ 믮 ( ० ),  ᯮ ᮮ⢥-
  (㥬) ,  १    
"ࠧ㤨" ⫠稪.  ᨬ  ⨯  ⮬    -
३    ﭨ  ஢    㯫    
  横 ࠡ⪨ ᨣ  த ᢮ 믮.    -
  ࠡ ⫠稪   祭, 饭 -
 ᮬ, ᭨  쭮  ஢  頥 ࠢ-
 짮⥫.
    ᫨   室 -⮬  ﭨ ஢ ⫠稪
 室  ﭨ ਮ⠭ (wait),   㦨  ⮬,  
    㭪樨 wait, ᫥ 祣  멤  㭪樨  -
 ࠡ  襮ᠭ .



                                    331
    +------------------------------------------------------+
    | int data[32];                                        |
    | main()                                               |
    | {                                                    |
    |     int i;                                           |
    |     for (i = 0; i < 32; i++)                         |
    |         printf("data[%d] = %d\n@,i,data[i]);         |
    |     printf("ptrace data addr Ox%x\n",data);          |
    | }                                                    |
    +------------------------------------------------------+

      㭮 11.2. ணࠬ trace (㥬 )


    ᬮਬ  ணࠬ, ਢ  㭪 11.2  11.3   -
  trace   debug, ᮮ⢥⢥.  ᪥ ணࠬ trace  ନ
ᨢ data 㤥 ᮤঠ 㫥 祭;  뢮   ᨢ
  蠥  ࠡ.   ᪥ ணࠬ debug  ।祩   ⢥
ࠬ 祭,  뢥  ணࠬ  trace,  ந室  ᫥饥:
ணࠬ    祭  ࠬ   ६ addr, ᮧ 
,   㭪樨 ptrace ⠢騩 ᥡ  ஢,  -
᪠ ணࠬ trace.  室  㭪樨  exec    뫠  -
-⮬ (  ⮦ trace) ᨣ SIGTRAP (ᨣ 뢠), -

    +------------------------------------------------------------+
    | #define TR_SETUP 0                                         |
    | #define TR_WRITE 5                                         |
    | #define TR_RESUME 7                                        |
    | int addr;                                                  |
    |                                                            |
    | main(argc,argv)                                            |
    |      int argc;                                             |
    |      char *argv[];                                         |
    | {                                                          |
    |      int i,pid;                                            |
    |                                                            |
    |      sscanf(argv[1],"%x",&addr);                           |
    |                                                            |
    |      if ((pid = fork() == 0)                               |
    |      {                                                     |
    |          ptrace(TR_SETUP,0,0,0);                           |
    |          execl("trace","trace",0);                         |
    |          exit();                                           |
    |      }                                                     |
    |      for (i = 0; i < 32, i++)                              |
    |      {                                                     |
    |          wait((int *) 0);                                  |
    |          /*  祭 i  ࠭⢮    |
    |           * 䨪஬ pid  , ᮤঠ饬  |
    |           * ६ addr */                             |
    |          if (ptrace(TR_WRITE,pid,addr,i) == -1)            |
    |               exit();                                      |
    |          addr += sizeof(int);                              |
    |      }                                                     |
    |      /* 㥬   믮 */    |
    |      ptrace(TR_RESUME,pid,1,0);                            |
    | }                                                          |
    +------------------------------------------------------------+

        㭮 11.3. ணࠬ debug (騩 )

                                    332



  trace 室  ﭨ ஢,  㯫  
ணࠬ debug. ᫨ , ॠ騩 ணࠬ debug, 室  -
ﭨ ਮ⠭, 易  믮 㭪樨 wait,    "஡㦤-
",  㦨  稥 ஦ 㥬   室 
㭪樨 wait. ⥬  debug 뢠 㭪 ptrace, 뢠 -
 ६ 横 i  ࠭⢮   trace   ,  -
ঠ饬    ६  addr,   㢥稢 祭 ६ addr; 
ணࠬ trace ६ addr ࠭  窨 室  ᨢ data. -
 饭  debug  㭪樨 ptrace 뢠    ணࠬ
trace,     ᨢ data ᮤন 祭  0  31. ⫠-
稪,    sdb,      ⠡ 䨪஢ 㥬
,  ன   ଠ   , ᯮ㥬
 ⢥ ࠬ஢ 㭪樨 ptrace.
    ᯮ짮 㭪樨 ptrace  ஢ ᮢ   
,     ⪮.
  *    ⮣, ⮡ ந । 樨    ᫮ 
    ᮬ-⫠稪  㥬 ᮬ,   믮 -
     ४祭 ⥪:  ४砥 ⥪    ६  맮
    ⫠稪  㭪樨 ptrace, 㦠  㦠 ⥪ 㥬
      ४砥 ⥪   -⫠稪    祭
    ⢥  㥬 .  㪠 室, ᪮-
      ⫠稪   ᯮᮡ    㠫쭮 ᭮-
      ࠭ 㥬 ,   ⥪
    楤 ஢.
  * -⫠稪   ६ ஢  ᪮쪨  -
    ᮢ-⮬,      ࠪ⨪   ᯮ ।.
    ᫨   , ᫥ ⬥,  ⫠稪   -
    ஢  ⮫쪮 ᢮  ⮬: ᫨ 㥬 --
     맮 㭪 fork, ⫠稪  㤥  ஫  ஦-
    ,   , ᮬ,   쥧 ९⢨ 
    ⫠ ஢ ணࠬ. ᫨ 㥬  뢠 -
     exec, ᪠ ࠧ  ⮦  ࣠  ஢  
    ࠢ  ࠭  맢  㭪樨  ptrace,  ⫠稪  
      ᯮ塞 ࠧ,   㤭  ஢  ᨬ쭮
    ⫠.
  *  ⫠稪      ஢ 㦥 믮饣 , ᫨
    ⫠   맢 ।⥫쭮 㭪  ptrace,    ⥬
    ᠬ  ᢮ ᮣᨥ  ஢.  㤮, ⠪   㪠-
      砥  믮騩  ਤ 㤠  ⥬  १-
      ० ஢.
  *  ࠧ蠥 ஢ setuid-ணࠬ, ᪮     -
        襭     (  १ 믮 㭪樨
    ptrace   ᭮ ࠭⢮ ந    )    
    믮    ⨬    ⢨.   ।,   ਬ,   
    setuid-ணࠬ ᪠ 䠩   "privatefile".  짮-
    ⥫   㭪樨 ptrace      䠩    "/bin/sh",
    ⨢    믮   shell (  ணࠬ, -
    塞 shell'),     ᮮ⢥  稩.  㭪
    exec     setuid, ᫨  ࣠ ஢, ⥬
    ᠬ ᭮ ࠭⢮ setuid-ணࠬ 頥   짮⥫-
    ᪮ .

     [Killian 84] 뢠  奬 ஢ ᮢ, ᭮-
  ४祭 䠩 ⥬ (.  5).  -
 䠩 ⥬   "/proc"; 짮⥫  
   䨪樨  ࠪ   䠩, ਭ騥 ⠫-
  "/proc".   ࠧ襭  ⨥ 䠩, 室   -

                                    333

䨪樨 짮⥫    䨪樨 㯯. 짮⥫  -
   ᭮ ࠭  ⥬ ⥭ (read) 䠩 
⠭ 窨 뢠 ⥬  (write)  䠩. 㭪 stat -
頥  ࠧ    ଠ,  .  
室 ࠭  ⪠, 騥 㭪樨  ptrace.  -,  
奬  ࠡ⠥ ॥, ᪮ -⫠稪   饭  㪠-
 ⥬ 㭪  ।  ଠ樨, 祬  ࠡ
 ptrace. -, ⫠稪    ஢ ᮢ襭  -
  ᮢ,   ⮫쪮 ᢮ ⮬. , 㥬 -
   ।ਭ ।⥫쭮  ⢨  ⮢ 
஢; ⫠稪  ஢   騥  .  -
  ⫠ setuid-ணࠬ, ।⠢塞 ⮫쪮 㯥௮짮-
, ॠ  ⠢  ࠤ樮 堭  䠩.


        11.2     V 

      IPC (interprocess communication)  ᨨ V ⥬ UNIX 砥
 ᥡ  堭. 堭 ᮮ饭  ᠬ  뫠
㣨 ᠬ ⮪ ଠ஢ , 堭 ࠧ  
  ᠬ ᮢ⭮ ᯮ짮 ⤥  㠫쭮 -
᭮ ࠭⢠,  ᥬ - ᨭ஭஢ ᢮ 믮  믮-
 ࠫ ᮢ. ᬮ  ,    ॠ    
⤥ ,   騥 ᢮⢠.
  *     堭 易 ⠡,   ன 뢠 
     ⠫.
  *    ᮤন ᫮  (key),  ।⠢ -
     䨪 , ࠭ 짮⥫.
  *   堭  ⥬ 㭪  ⨯  "get",  ᯮ㥬
      ᮧ    ᪠ 饩 ; ࠬࠬ 㭪樨
     䨪   ࠧ 䫠 (flag).   
       䨪  ᮮ⢥饩 ⠡.    
     䫠 IPC_PRIVATE ࠭஢ 祭  ᯮ㥬 -
    .   䫠 IPC_CREAT   ᮧ  , ᫨ -
        㪠  䨪஬ ,  ᫨   ⮬  ⠭
    䫠 IPC_EXCL,   㢥  訡  ⮬  砥,  ᫨
      ⠪ 䨪஬ . 㭪 頥  -
    ࠭  ஬ ਯ, ।祭  ᫥饣 ᯮ짮
     㣨 ⥬ 㭪, ⠪ ࠧ,  ࠡ⠥ 筮 -
    ⥬ 㭪 creat  open.
  *   堭  ᯮ ᫥   ᪠  -
    ਯ 㪠⥫    ⠡  :

    㪠⥫ = 祭 ਯ    ᫠ ᥩ  ⠡

    ᫨, ਬ, ⠡  ᮮ饭 ⮨  100 ᥩ, -
    ਯ, 易    1,  祭, ࠢ 1, 101, 201
     ..   㤠 ,  㢥稢 祭 易-
       ਯ  ᫮ ᥩ  ⠡:  祭  ਯ
    ⠭   ਯ஬ ⮩ ,     㤥 ந-
     饭   㭪樨 ⨯ "get".  ,    
           ஬ ਯ,  㤠-
    . ⨬   ।饬 ਬ. ᫨   1 易 -
    ਯ, 騩 祭 201,   㤠     -
      ਯ, 騩 祭 301. , 騥  
    ਯ 201,  訡, ᪮ ⮣ ਯ  .
     筮 ⮣  ந ७㬥 ਯ஢,   
    ந,  ன ⥫ ஬⮪ ६.
  *      , 뢠 ࠢ 㯠  

                                    334

        ᥡ 짮⥫᪨  㯯  䨪樨,
        ,  ᮧ訩  ,   ⠪ 짮⥫᪨ 
    㯯   䨪樨,  ⠭  ⥬  㭪樥  ⨯
    "control"  (  ⮬ ),    ࠧ襭 ⥭---
      , 㯯   짮⥫,    -
    ⠭ ࠢ 㯠  䠩.
  *     㣠 ଠ, 뢠 ﭨ ,
     ⭮, 䨪 ᫥  ᮢ,    
      (뫪 ᮮ饭, ਥ ᮮ饭, 祭 ࠧ塞 -
      ..),  ६ ᫥ 饭  ४஢.
  *   堭  ⥬ 㭪 ⨯ "control", 訢-
     ଠ  ﭨ ,   ଠ  㤠-
       ⥬.   訢 ଠ   ﭨ
    ,    ஢,     ࠧ襭  ⥭ ,
    ᫥ 祣     ⠡  , 㪠 -
    ⥫.  ⠭ 祭 ਭ   ࠬ஢  
    ஢,  ᮢ    ᮡ 짮⥫᪨  䨪樨
      䨪 짮⥫ ( ᮧ⥫), 㪠  -
    ,  饭    ࠢ 㯥௮짮⥫;  ࠧ-
    襭   筮  ⠭ ࠬ஢.    
    ᮮ饭  짮⥫ ଠ   ⠡, ⠭ -
    祭 짮⥫᪮  㯯  䨪樨, ० 㯠
     㣨 ࠬ ( ᨬ  ⨯ 堭).     
    祭  , 뢠 짮⥫᪨  㯯  -
    樨 ᮧ⥫ , ⮬ 짮⥫, ᮧ訩 , ࠭-
     ࠢ騥 ࠢ  . 짮⥫  㤠 ,  -
       㯥௮짮⥫,  ᫨ 䨪  ᮢ-
        䨪஢, 㪠     .  
    㢥稢   ਯ, ⮡  ᫥饬 祭  
     ᢮  ਯ. ⥫쭮,  㦥 ࠭  ਫ,
    ᫨  ⠥     ஬ ਯ, -
      㭪  ⪠.


        11.2.1 饭

     ᮮ饭ﬨ ࠡ  ⥬ 㭪樨: msgget,  -
頥 (    ᮧ) ਯ ᮮ饭, ।騩 -
।  ᮮ饭  ᯮ㥬 㣨 ⥬묨 㭪ﬨ, msgctl, 
⠭  頥 易  ਯ஬ ᮮ饭 ࠬ  
㤠  ਯ,  msgsnd,  뫠 ᮮ饭,  msgrcv, 
砥 ᮮ饭.
    ⠪ 맮 ⥬ 㭪樨 msgget:

    msgqid = msgget(key,flag);

 msgqid - 頥 㭪樥 ਯ,  key  flag     -
⨪,    ⥬ 㭪樨 ⨯ "get".  ࠭ ᮮ饭  -
  ᯨ᪥ (।), ।塞 祭 ਯ,  ᯮ -
祭 msgqid  ⢥ 㪠⥫  ᨢ  ।. ஬ -
㪠 , 뢠 騥  ᥣ 堭 ࠢ 㯠,  -
 । ᮤন ᫥騥 :
  * ⥫  ࢮ  ᫥ ᮮ饭  ᯨ᪥;
  * ⢮ ᮮ饭  騩 ꥬ ଠ樨  ᯨ᪥  ;
  * ᨬ쭠  ᯨ᪠  ;
  * 䨪 ᮢ, ᫠  ਭ ᮮ饭 ᫥;
  *  ,  㪠뢠騥 ६ ᫥ 믮 㭪権 msgsnd, msgrcv 
    msgctl.
     짮⥫ 뢠 㭪 msgget  ⮣, ⮡ ᮧ 

                                    335

ਯ,  ᬠਢ ᨢ । ᮮ饭  ᪠ -
饩 ।  㪠 䨪஬. ᫨ ⠪ । ,  뤥-
  ।, 樠   頥 䨪 짮-
.  ⨢ 砥  ஢ 稥 室 ࠢ 㯠  -
蠥 믮 㭪樨.
     뫪 ᮮ饭  ᯮ ⥬ 㭪 msgsnd:

    msgsnd(msgqid,msg,count,flag);

 msgqid - ਯ  ।  ᮮ饭,  筮  頥  㭪樥
msgget,  msg - 㪠⥫  ,   ⨯   砥
짮⥫ 楫 ᫠  ᨢ ᨬ, count - ࠧ ଠ樮-
 ᨢ, flag - ⢨, ।ਭ  ஬    砥  ९
७ ୮ ࠭⢠.
      ஢  (㭮 11.4),    뫠饣 ᮮ饭 -
 ࠧ襭    㪠 ਯ,  室    ࠧ
ᮮ饭    ⠭  ⥬  ࠭,   ᮤন   ।
᫨誮 让 ꥬ ଠ樨,  ⠪   ⨯ ᮮ饭  -
⥫  楫  ᫮.  ᫨  ᫮ ᮡ,  뤥 ᮮ饭
, ᯮ  ᮮ饭 (. ࠧ 9.1),        
    ࠭⢠ 짮⥫.  ᮮ饭 ᮥ ,
᫥ 祣  頥   吝 ᯨ᪠    ᮮ饭.  
 ᮮ饭 뢠 ⨯  ࠧ ᮮ-

    +------------------------------------------------------------+
    |  msgsnd       /* ᫠ ᮮ饭 */              |
    | 室 ଠ:  (1) ਯ । ᮮ饭      |
    |                      (2)   ᮮ饭         |
    |                      (3) ࠧ ᮮ饭                  |
    |                      (4) 䫠                             |
    | 室 ଠ: ⢮ ᫠              |
    | {                                                          |
    |    ஢ ࠢ쭮 㪠 ਯ  稥   |
    |     ᮮ⢥ ࠢ 㯠;                          |
    |    믮  ( ࠭ ᮮ饭  㤥 뤥|
    |     )                                                 |
    |    {                                                       |
    |        ᫨ (䫠  ࠧ )                     |
    |              ;                                    |
    |        ਮ⠭ (  ,    ᢮-  |
    |         );                                            |
    |    }                                                       |
    |      ᮮ饭;                           |
    |     ⥪ ᮮ饭  ࠭⢠   - |
    |     ࠭⢮ ;                                          |
    |    ந  : ந । |
    |     ᮮ饭, ⠭   㪠⥫  ⥪   |
    |     ᮮ饭,  , ᮤঠ騥 稪, ६  |
    |     ᫥ 믮 権  䨪 - |
    |     ;                                                    |
    |    뢥  ﭨ ਮ⠭  , 騥|
    |     ࠧ襭  ᮮ饭  ।;               |
    | }                                                          |
    +------------------------------------------------------------+

              㭮 11.4.  뫪 ᮮ饭


,  ⠭  㪠⥫  ⥪ ᮮ饭  ந ४-

                                    336

஢ ᮤন ࠧ   ।, ᮤঠ -
 ଠ (⢮ ᮮ饭  ।   㬬 ꥬ    -
,  ६ ᫥ 믮 権  䨪 , ᫠-
襣 ᮮ饭). ⥬  뢮  ﭨ ਮ⠭    ,
騥   । ᮮ饭. ᫨ ࠧ ।   ॢ-
蠥 ࠭ ⨬,  ਮ⠭   ,   -
  ᮮ饭  㩤  ।. , ᫨  뫮  㪠
  (䫠 IPC_NOWAIT),   頥 ࠢ   㢥-
  訡.  㭪 11.5  । ᮮ饭,   -
  ᮮ饭,  ࣠   吝 ᯨ᪨,  㪠⥫ﬨ  -
 ⥪.
    ᬮਬ ணࠬ, ।⠢  㭪 11.6.    뢠
㭪  msgget  ⮣, ⮡  ਯ    䨪-
஬ MSGKEY.  ᮮ饭 ਭ ࠢ 256 ,  ᯮ
⮫쪮 ࢮ  楫 ⨯,   ⥪ ᮮ饭   -
䨪  , ⨯ ᮮ饭 ᢠ 祭 1, ᫥ 祣 -
뢠 㭪 msgsnd  뫪 ᮮ饭.  ୥   ⮬  ਬ
.
      砥 ᮮ饭, 뢠 㭪 msgrcv  ᫥饬 ଠ-
:
    count = msgrcv(id,msg,maxcount,type,flag);

 id - ਯ ᮮ饭, msg -  짮⥫᪮ , -
 㤥 ᮤঠ 祭 ᮮ饭, maxcount - ࠧ    msg,
type  - ⨯ 뢠 ᮮ饭, flag - ⢨, ।ਭ ஬ 
⮬ 砥, ᫨  । -

                                             
    ।                                          ⥪
    +------+            ᮮ饭        +->+------+
    |      |     +------+    +------+    +------+ |  |      |
    |    --+---->|      +--->|      +--->|      | |  |      |
    |      |     +---+--+    +---+--+    +---+--+ |  |      |
    +------+         |           |           +----+  |      |
    |      |         +-----------|------------------>+------+
    |      |                     |                   |      |
    |      |                     |                   |      |
    +------+                     |                   |      |
    |      |     +------+        |                   |      |
    |    --+---->|      |        |                   |      |
    |      |     +---+--+        |                   |      |
    +------+         |           |                   |      |
    |   -  |         |           |                   +------+
    |   -  |         +-----------|------------------>+------+
    |   -  |                     |                   |      |
    |   -  |                     |                   |      |
    |   -  |                     +------------------>+------+
    |   -  |                                         |      |
    |   -  |                                         +------+
    |   -  |                                         |   -  |
    |   -  |                                         |   -  |
    |   -  |                                         |   -  |
    +------+                                         +------+

    㭮 11.5.  , ᯮ㥬  ࣠樨 ᮮ饭


饭 .  ६ count 짮⥫ 頥 ᫮  ⠭
 ᮮ饭.

                                    337

      ஢  (㭮 11.7),   짮⥫ 室 ࠢ
㯠  । ᮮ饭. ᫨ ⨯ 뢠 ᮮ饭    㫥
祭,      ࢮ    ᮮ饭  吝 ᯨ᪥. ᫨ 
ࠧ   ࠢ ࠧ,  㪠  짮⥫,    
⥪ ᮮ饭  짮⥫   ᮮ⢥騬 ࠧ -
ࠨ  ᢮  ७ : 㬥蠥 稪 ᮮ饭  । 
㬬 ꥬ ଠ樨  ,  ६ 祭 ᮮ饭  
䨪 -⥫, ࠨ 吝 ᯨ᮪  ᢮-
      ⥬ ࠭⢥,  ࠭ ⥪ ᮮ饭. ᫨ -
- , 訥 祭  ᮮ饭,  室    ﭨ
ਮ⠭  -  ⢨ ᢮   ᯨ᪥,  뢮  
⮣ ﭨ. ᫨ ࠧ ᮮ饭 ॢ蠥 祭 maxcount,  㪠-
  짮⥫,   뫠 ⥬ 㭪樨 㢥  訡 
⠢ ᮮ饭  ।. ᫨, ⥬  ,    -
祭    ࠧ  (  flag ⠭  MSG_NOERROR),  १
ᮮ饭, 頥 襭 ⢮     㤠  ᮮ饭  
ᯨ᪠ 楫.

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/ipc.h>                                       |
    | #include <sys/msg.h>                                       |
    |                                                            |
    | #define MSGKEY     75                                      |
    |                                                            |
    | struct msgform {                                           |
    |        long     mtype;                                     |
    |        char     mtext[256];                                |
    | };                                                         |
    |                                                            |
    | main()                                                     |
    | {                                                          |
    |        struct msgform msg;                                 |
    |        int msgid,pid,*pint;                                |
    |                                                            |
    |        msgid = msgget(MSGKEY,0777);                        |
    |                                                            |
    |        pid = getpid();                                     |
    |        pint = (int *) msg.mtext;                           |
    |        *pint = pid;         /* ஢ 䨪  |
    |                              *    ⥪   |
    |                              * ᮮ饭 */                |
    |        msg.mtype = 1;                                      |
    |                                                            |
    |        msgsnd(msgid,&msg,sizeof(int),0);                   |
    |        msgrcv(msgid,&msg,256,pid,0);   /* 䨪    |
    |                               *  ᯮ     |
    |                               * ⢥ ⨯ ᮮ饭 */ |
    |        printf(": 稫    pid %d\n",    |
    |               *pint);                                      |
    | }                                                          |
    +------------------------------------------------------------+

              㭮 11.6. 짮⥫᪨ 


       ᮮ饭 । ⨯, ᫨ ᢮ -
  type  ᮮ⢥饥  祭.  ᫨  ⥫쭮 楫 ᫮,
㭪 頥 ࢮ 祭  ⨯,  ᫨  ⥫쭮,  

                                    338

। 쭮 祭 ⨯ ᮮ饭  ।,  ᫨   -
蠥  ᮫⭮ 祭 ࠬ type, 頥  ࢮ ᮮ-
饭 ⮣ ⨯. ਬ, ᫨ । ⮨   ᮮ饭,  
⨯  3,  1  2, ᮮ⢥⢥,  짮⥫ 訢 ᮮ饭  ⨯
-2,  頥  ᮮ饭 ⨯ 1.     ,  ᫨  ᫮
  㤮⢮    ᮮ饭  ।,  ॢ -
  ﭨ ਮ⠭, ࠧ㬥 ᫨ ⮫쪮  ࠬ flag  -
⠭  IPC_NOWAIT (   室  㭪樨).
    ᬮਬ  ணࠬ, ।⠢  㭪 11.6  11.8. ணࠬ
 㭪 11.8 ⢫ 饥  㦨  ᮢ  짮⥫᪨
ᮢ  (⮢).  , ਬ,   ଠ樨, ࠭-
饩   ; 㦨騩   (ࢥ)  㯠  室
।  饭   , ⠪ 冷 砥 ঠ
楫⭮    ࣠    ᠭ樮஢ 㯠.
㦨騩  ᮧ ᮮ饭 ⥬ ⠭ 䫠 IPC _CREAT 

    +------------------------------------------------------------+
    |  msgrcv     /* 祭 ᮮ饭 */              |
    | 室 ଠ:  (1) ਯ ᮮ饭              |
    |                      (2)  ᨢ,   |
    |                          ᮮ饭                         |
    |                      (3) ࠧ ᨢ                    |
    |                      (4) ⨯ ᮮ饭             |
    |                      (5) 䫠                             |
    | 室 ଠ: ⢮   祭 ᮮ饭|
    | {                                                          |
    |      ஢ ࠢ 㯠;                              |
    |   loop:                                                    |
    |      ஢ ࠢ쭮 ਯ ᮮ饭;         |
    |      /*  ᮮ饭, 㦭 짮⥫ */            |
    |      ᫨ (⨯ ᮮ饭   == 0)                   |
    |           ᬮ ࢮ ᮮ饭  ।;          |
    |       ⨢ 砥 ᫨ (⨯ ᮮ饭   > 0) |
    |           ᬮ ࢮ ᮮ饭  ।, 饥  |
    |             ⨯;                                     |
    |       ⨢ 砥   /* ⨯ ᮮ饭   < 0 */|
    |           ᬮ ࢮ  ᮮ饭  ।  - |
    |            訬 祭 ⨯  ᫮,   ⨯ |
    |             ॢ蠥 ᮫⭮ 祭 ⨯, 㪠-|
    |              ;                                   |
    |      ᫨ (ᮮ饭 )                              |
    |      {                                                     |
    |           ⠭ ࠧ ᮮ饭   訡-|
    |            , ᫨ ࠧ, 㪠 짮⥫ ᫨誮|
    |            ;                                            |
    |           ᪮஢ ⨯ ᮮ饭   ⥪  -  |
    |            ࠭⢠   ࠭⢮ ;             |
    |           ࠧࢠ  ᮮ饭  ।;            |
    |            ࠢ;                              |
    |      }                                                     |
    |      /* ᮮ饭  */                                   |
    |      ᫨ (䫠  ࠧ ਮ⠭ ࠡ)     |
    |            ࠢ  訡;                    |
    |      ਮ⠭ ( ᮮ饭    -  |
    |       );                                                 |
    |      ३  loop;                                      |
    | }                                                          |
    +------------------------------------------------------------+
             㭮 11.7.  祭 ᮮ饭

                                    339



믮 㭪樨 msgget  砥  ᮮ饭 -
 1 -   ᮢ-⮢.   ⠥  ⥪  ᮮ饭,  室
䨪 -  ࠢ 頥 祭 ⨯ -
饭  祭  ⮣ 䨪.   ਬ 㦨騩 -
 頥  ⥪ ᮮ饭  -    䨪,  
  砥 ᮮ饭  ⨯, ࠢ 䨪 .  -
ࠧ, 㦨騩  砥 ᮮ饭 ⮫쪮  ⮢,  
- ⮫쪮  㦨饣 .   ᮢ  ॠ    
쭮  ⢨, 饣  ᭮  । ᮮ-
.

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/ipc.h>                                       |
    | #include <sys/msg.h>                                       |
    |                                                            |
    | #define MSGKEY     75                                      |
    | struct msgform                                             |
    | {                                                          |
    |        long     mtype;                                     |
    |        char     mtext[256];                                |
    | }msg;                                                      |
    | int msgid;                                                 |
    |                                                            |
    | main()                                                     |
    | {                                                          |
    |       int i,pid,*pint;                                     |
    |       extern cleanup();                                    |
    |                                                            |
    |       for (i = 0; i < 20; i++)                             |
    |            signal(i,cleanup);                              |
    |       msgid = msgget(MSGKEY,0777|IPC_CREAT);               |
    |                                                            |
    |       for (;;)                                             |
    |       {                                                    |
    |            msgrcv(msgid,&msg,256,1,0);                     |
    |            pint = (int *) msg.mtext;                       |
    |            pid = *pint;                                    |
    |            printf("ࢥ: 稫    pid %d\n",|
    |                   pid);                                    |
    |            msg.mtype = pid;                                |
    |            *pint = getpid();                               |
    |            msgsnd(msgid,&msg,sizeof(int),0);               |
    |       }                                                    |
    | }                                                          |
    |                                                            |
    | cleanup()                                                  |
    | {                                                          |
    |       msgctl(msgid,IPC_RMID,0);                            |
    |       exit();                                              |
    | }                                                          |
    +------------------------------------------------------------+

            㭮 11.8. 㦨騩  (ࢥ)


    饭   "⨯ - ⥪",  ⥪ ।⠢ ᮡ  ⮪

                                    340

⮢.    ⨯  ᠬ  롨 ᮮ饭 ⮫쪮
। த,   䠩 ⥬  ⠪  ᤥ.  -
,   롨  । ᮮ饭 । ⨯    -
浪    㯫, 祬  । ࠭ ஬. ᬮ
 ,   ᮮ饭ﬨ   ॠ  짮⥫᪮ ஢-
 ।⢠ 䠩  ⥬,  ।⠢  襬    堭
ᯥ稢  䥪⨢ ࣠ ।   ᠬ.
       ⥬ 㭪樨 msgctl    ଠ 
 ਯ ᮮ饭, ⠭    㤠 ਯ
ᮮ饭  ⥬. ⠪ 맮 㭪樨:

    msgctl(id,cmd,mstatbuf)

 id - ਯ ᮮ饭, cmd - ⨯ , mstatbuf -  짮-
⥫᪮ ,  ன  ࠭ ࠢ騥 ࠬ   -
 ࠡ⪨ .  ஡  㬥 㭪樨  
 ਫ.
    ୥   ਬ, ।⠢  㭪 11.8. 㦨騩 -
 ਭ ᨣ    㭪樨 cleanup 㤠 । ᮮ饭
 ⥬. ᫨    뫮     ᨣ      祭
ᨣ  SIGKILL,  ।  ᮮ饭 ⠥  ⥬,  ᫨   
뫠    ᮢ. 쭥訥  ⪨  ᪫⥫쭮  ᮧ
 । ᮮ饭   箬 (䨪஬)    -
   ,   ।  㤥 㤠  ⥬.


        11.2.2  

        ⢮     㣮 ।⢥ ⥬
ࠧ (ᮢ⭮ ᯮ짮) ⪮ 㠫쭮 ᭮ -
࠭⢠   묨 १ ࠧ塞 .  ⥬  㭪樨  
ࠡ  ࠧ塞    室  ⥬묨 㭪ﬨ 
ࠡ  ᮮ饭ﬨ. 㭪 shmget ᮧ   ࠧ塞 -
    頥   㦥 饩 , 㭪 shmat ᪨
ᮥ   㠫쭮 ᭮ ࠭ , 㭪
shmdt ᮥ ,  㭪 shmctl    ࠧ묨  ࠬࠬ,
易묨    ࠧ塞  .   ⥭    
 ࠧ塞 , ᯮ  ⮣   ᠬ 設  -
,      ࠡ  筮 . ᫥ ᮥ  㠫쭮
᭮ ࠭   ࠧ塞   ⠭  -
㯭 ⠪ ,   ⮪ 㠫쭮 ;  㯠  室騬-
     㦭 饭  - ⥫ ⥬ 㭪-
.
    ⠪ 맮 ⥬ 㭪樨 shmget:

    shmid = shmget(key,size,flag);

  size - ꥬ   .  ᯮ key   ᪠ 
⠡ ࠧ塞 : ᫨ 室  㦥  ᫨  ࠧ-
襭      ,  頥 뢠饬  㪠 
 ਯ. ᫨     ᫨ 짮⥫ ⠭ 䫠
IPC_CREAT, 㪠뢠騩  室 ᮧ  ,   ஢-
 宦 ࠧ   ⠭ ⥬ ।  뤥
   allocreg (ࠧ 6.5.2).  뢠 ⠭ ࠢ
㯠, ࠧ   㪠⥫  ᮮ⢥  ⠡ -
⥩  ⠡ ࠧ塞  (㭮 11.9)  ⠭ 䫠, ᢨ-
⥫騩   ⮬,     易 ⤥쭠 .  -
  (⠡ ࠭  ..) ⮫쪮 ⮣,   ᮥ-
   ᢮ ᭮  ࠭.    ⠭  ⠪

                                    341

䫠,  騩    ⮬,   襭 ᫥ 易  
    ᢮.  ࠧ,    ࠧ-
    ࠭,  ᫨   ਭ   
ᮢ (  㠫쭮 ᭮ ࠭⢠ ᫥).

     ࠧ-                              ᮢ -
    塞 -        ⥩      ⭠ ⠡ -
                                           ⥩ 
    +----------+       +--------------+          +---------+
    |      ----+----+  |              |     +----+----     |
    +----------+   +|->+--------------+<----+    +---------+
    |      ----+---+|  |              |      +---+----     |
    +----------+    |  +--------------+<----+|   +---------+
    |      ----+--+ |  |              |     +|---+----     |
    +----------+  | |  +--------------+      |   +---------+
    |     -    |  | |  |              |      |   |         |
    |     -    |  | +->+--------------+      |   +---------+
    |     -    |  |    |              |      |   |         |
    |     -    |  +--->+--------------+<-----+   +---------+
    |     -    |       |              |  (᫥  |         |
    |     -    |       +--------------+   shmat) +---------+
    |     -    |       |      -       |          |         |
    |     -    |       |      -       |          +---------+
    |     -    |       +--------------+          |    -    |
    |     -    |                                 |    -    |
    +----------+                                 +---------+

    㭮 11.9.  , ᯮ㥬  ࠧ 


      ᮥ    ࠧ塞   ᢮ 㠫쭮
᭮ ࠭   ⥬ 㭪樨 shmat:

    virtaddr = shmat(id,addr,flags);

祭 id, 頥 㭪樥 shmget,    ࠧ-
  , addr  㠫 ᮬ,  ஬ 짮⥫ -
  ,    䫠 (flags)  㪠, ।-
祭   ⮫쪮  ⥭  㦭   㣫 祭 㪠-
 짮⥫ . 頥 㭪樥 祭, virtaddr,  ।-
⠢  ᮡ 㠫 ,  ஬  ந 祭 -
    ᥣ ᮢ  ᮬ, 㪠 짮⥫.
     砫 믮 ⥬ 㭪樨 shmat    ஢  稥  
  室  ࠢ 㯠   (㭮 11.10).  ᫥
㪠 짮⥫ ; ᫨  ࠢ 0,    롨ࠥ  㠫
  ᢮ ᬮ७.
     ࠧ塞    ᥪ  㠫쭮 ᭮
࠭⢥      㣨 ﬨ; ᫥⥫쭮,  롮 
ந ࠧ㬭  ஦. , ਬ,      㢥
ࠧ  ਭ饩       ⥬ 㭪樨 brk, 
   㤥 ᮤঠ , ᬥ  ० ; -
⮬,   ᫥ ᮥ  ࠧ塞  ᫨誮 -
    .    ᫥ ࠧ   ࠧ-
     設 ⥪, ⮡ ⥪  ᢮ ᫥饬 㢥-
祭     ।. ᫨, ਬ, ⥪      ࠢ
㢥祭 ᮢ,  ᥣ ࠧ  ࠧ塞  -
।⢥ । 砫  ⥪.
      ஢   ࠧ饭  ࠧ塞   -


                                    342

    +------------------------------------------------------------+
    |  shmat     /*  ࠧ塞  */     |
    | 室 ଠ:  (1) ਯ  ࠧ塞    |
    |                                                      |
    |                      (2) 㠫   祭 |
    |                                                     |
    |                      (3) 䫠                             |
    | 室 ଠ: 㠫 ,  ஬ |
    |                      祭 䠪᪨                 |
    | {                                                          |
    |     ஢ ࠢ쭮 㪠 ਯ, ࠢ - |
    |      㯠  ;                                      |
    |     ᫨ (짮⥫ 㪠 㠫 )           |
    |     {                                                      |
    |          㣫 㠫   ᮮ⢥⢨  䫠- |
    |           ;                                            |
    |          ஢ ⢮ 祭 , ࠧ|
    |           ;                                         |
    |     }                                                      |
    |      ⨢ 砥   /* 짮⥫ , ⮡  |
    |                           * ᠬ 諮 室騩  */ |
    |           롨ࠥ :  砥 㤠 뤠    |
    |           訡;                                          |
    |     ᮥ   ᭮ ࠭  |
    |      ( attachreg);                                 |
    |     ᫨ ( ᮥ )                  |
    |          뤥 ⠡ ࠭  ⢥    |
    |           ( growreg);                              |
    |      (㠫  䠪᪮ ᮥ  |
    |      );                                             |
    | }                                                          |
    +------------------------------------------------------------+

       㭮 11.10.  ᮥ ࠧ塞 


᭮  ࠭⢥      ᮥ          ⬠
attachreg. ᫨ 뢠騩    ᮬ,  -
  ,  뤥    室 ⠡, ᯮ-
  growreg, 뢠 ६ ᮥ  ᮮ⢥饥  
⠡ ࠧ塞   頥  㠫 ,  -
஬  뫠  祭 䠪᪨.
    ᮥ  ࠧ塞   㠫쭮 ᭮ -
࠭⢠  믮 㭪

    shmdt(addr)

  addr  - 㠫 , 饭 㭪樥 shmat. ᬮ  ,
  筮 ।⠢ । 䨪,  ᯮ-
 㠫  ࠧ塞 , ᪮      ࠧ-
塞    祭  ᭮ ࠭  -
쪮 ࠧ,  ⮬   䨪   㤠    ⥬.  
ந     㪠   ᮥ   ᭮
࠭⢠ , ᯮ  detachreg (ࠧ 6.5.7). ᪮-
  ⠡ ⥩   㪠⥫  ⠡ ࠧ塞
,  室 ᬠਢ ⠡ ࠧ塞     ᪠
,  㪠뢠饩    ,  뢠  ᮮ⢥饥 
६ ᫥ ⪫祭 .
    ᬮਬ ணࠬ, ।⠢  㭪 11.11.   뢠

                                    343

, ᮧ騩  ࠧ塞  ࠧ஬ 128      
ᮥ騩    ᢮ ᭮ ࠭  ࠧ 㠫 -
ᠬ.  ""   뢠 ,  ⠥   "ன"  -
.  㭪 11.12  㣮 , ᮥ騩   
( 砥 ⮫쪮 64 , ⠪ ࠧ,    ᯮ짮-
 ࠧ ꥬ  ࠧ塞 );   ,  
    ࢮ ਭ饥  ᫮  ⫨筮  
祭,  ⥬ ਭ 뢠    .    
  ""  (pause), ।⠢ ஬   믮-
;    ਭ ᨣ,  㤠    ࠧ塞
  ⥬.
      訢 ଠ  ﭨ  ࠧ塞  
ந ⠭ ࠬ஢     ⥬ 㭪樨 shmctl:

    shmctl(id,cmd,shmstatbuf);

祭 id   ⠡ ࠧ塞 , cmd ।
⨯ 樨,  shmstatbuf  ᮬ  짮⥫᪮  ,  
  頥 ଠ  ﭨ .  ࠪ ⨯ -
樨 筮 ⠪ ,    ࠢ ᮮ饭ﬨ.   ࠧ-
 ,  ᢮ ᮮ⢥    ⠡ ࠧ塞
  ᬠਢ ⠡ ⥩: ᫨    뫠  ᮥ
      ᮢ,  ᢮  ⠡   뤥
 , ᯮ  ⮣  freereg (ࠧ  6.5.6).  ᫨
    -०  祭  - ᠬ (祭 稪
뫮    0),  ⮫쪮 뢠 䫠, 騩   ⮬,  
  襭  ᫥ 易       ᢮-
. , 㦥 ᯮ騥  ࠧ塞 , த
ࠡ  ,      ᮥ .     -
  ⪫ ,  ᢮ .  宦  ,   䠩
⥬ ᫥ ࠧ뢠 裡  䠩        -
   ࠡ.


        11.2.3 

    ⥬  㭪樨 ࠡ  ᥬࠬ ᯥ稢 ᨭ஭ 믮-
 ࠫ ᮢ, ந  ⢨ ⢥  -
 ᥬ஢ (।⢠  ஢).  ᯮ짮 ᥬ஢,  ᫨
 㦭 뫮 ஢  ,  ਡ  ᮧ  -
 ⥬ 㭪樨 creat ᯥ樠쭮 饣 䠩. ᫨ 䠩 㦥
⢮,  㭪  creat  蠫  㤠筮,    뢮 
⮬,   㦥 ஢ 㣨 ᮬ.  ⪨ ⠪
室 砫  ⮬,    ,       ᫥
।ਭ ᫥ ,  ⠪  ⮬,  騥 䠩 砩
⠢  ⥬  砥 
਩ 襭  १㧪.
    ன  㡫  , 뢠騩 ॠ ᥬ-
஢    楫᫥  ꥪ⮢,   ।  
樨: P  V (. [Dijkstra 68]).   P  砥    㬥襭
祭 ᥬ  ⮬ 砥, ᫨   0,  V -  㢥祭
⮣ 祭 ( ⠬,  ⠬  ). ᪮ 樨 , 
   ६   ᥬ 믮    -
樨 P  V. 易  ᥬࠬ ⥬  㭪樨    饭
権, । ன,   ᪠ ६ 믮
᪮쪨 権, 祬 樨 㬥襭  㢥祭 믮 
祭ﬨ,  ॢ騬  1.  믮 樨 ᭮;   
஭ ᮢ  ᬮ ⠭ 祭  ᥬ஢,  


                                    344

  樨    믮. ᫨   - 稭  
믮  樨,   믮  ;   ਮ⠭
᢮ ࠡ   ,     㤥 ।⠢.
      ᨨ V ⥬ UNIX ⮨  ᫥ ⮢:
  * 祭 ᥬ,
  * 䨪 ᫥  ᮢ, ࠡ⠢  ᥬ஬,
  * ⢮ ᮢ,  㢥祭 祭 ᥬ,
  *  ⢮ ᮢ,  ,  祭 ᥬ ⠭
    ࠢ 0.
     ᮧ  ᥬ஢  祭  㯠      ᯮ
⥬  㭪 semget,  믮 ࠧ ࠢ 権 
஬ - 㭪 semctl,   ࠡ    祭ﬨ  ᥬ஢  -  㭪
semop.

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/ipc.h>                                       |
    | #include <sys/shm.h>                                       |
    | #define SHMKEY    75                                       |
    | #define    K    1024                                       |
    | int shmid;                                                 |
    |                                                            |
    | main()                                                     |
    | {                                                          |
    |     int i, *pint;                                          |
    |     char *addr1, *addr2;                                   |
    |     extern char *shmat();                                  |
    |     extern cleanup();                                      |
    |                                                            |
    |     for (i = 0; i < 20; i++)                               |
    |          signal(i,cleanup);                                |
    |     shmid = shmget(SHMKEY,128*K,0777|IPC_CREAT);           |
    |     addr1 = shmat(shmid,0,0);                              |
    |     addr2 = shmat(shmid,0,0);                              |
    |     printf("addr1 Ox%x addr2 Ox%x\n",addr1,addr2);         |
    |     pint = (int *) addr1;                                  |
    |                                                            |
    |     for (i = 0; i < 256, i++)                              |
    |          *pint++ = i;                                      |
    |     pint = (int *) addr1;                                  |
    |     *pint = 256;                                           |
    |                                                            |
    |     pint = (int *) addr2;                                  |
    |     for (i = 0; i < 256, i++)                              |
    |          printf("index %d\tvalue %d\n",i,*pint++);         |
    |                                                            |
    |     pause();                                               |
    | }                                                          |
    |                                                            |
    | cleanup()                                                  |
    | {                                                          |
    |     shmctl(shmid,IPC_RMID,0);                              |
    |     exit();                                                |
    | }                                                          |
    +------------------------------------------------------------+

    㭮 11.11. ᮥ ᮬ   ⮩  
                   ࠧ塞  


                                    345

      +-----------------------------------------------------+
      | #include <sys/types.h>                              |
      | #include <sys/ipc.h>                                |
      | #include <sys/shm.h>                                |
      |                                                     |
      | #define SHMKEY    75                                |
      | #define    K    1024                                |
      | int shmid;                                          |
      |                                                     |
      | main()                                              |
      | {                                                   |
      |     int i, *pint;                                   |
      |     char *addr;                                     |
      |     extern char *shmat();                           |
      |                                                     |
      |     shmid = shmget(SHMKEY,64*K,0777);               |
      |                                                     |
      |     addr = shmat(shmid,0,0);                        |
      |     pint = (int *) addr;                            |
      |                                                     |
      |     while (*pint == 0)                              |
      |          ;                                          |
      |     for (i = 0; i < 256, i++)                       |
      |          printf("%d\n",*pint++);                    |
      | }                                                   |
      +-----------------------------------------------------+

         㭮 11.12.    ᠬ



        ᥬ஢         ᨢ ᥬ஢
           +-------+
           |       |        +---+---+---+---+---+---+---+
           |       +------->| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
           |       |        +---+---+---+---+---+---+---+
           +-------+
           |       |        +---+---+---+
           |       +------->| 0 | 1 | 2 |
           |       |        +---+---+---+
           +-------+
           |       |        +---+
           |       +------->| 0 |
           |       |        +---+
           +-------+
           |       |        +---+---+---+
           |       +------->| 0 | 1 | 2 |
           |       |        +---+---+---+
           +-------+
           |   -   |
           |   -   |
           |   -   |
           |   -   |
           |   -   |
           +-------+


    㭮 11.13.  , ᯮ㥬  ࠡ  ᥬࠬ


                                    346

    ⠪ 맮 ⥬ 㭪樨 semget:

    id = semget(key,count,flag);

 key, flag  id    ,    㣨 堭 -
⢨  ᮢ ( ᮮ饭ﬨ  ࠧ ).  १ 믮-
 㭪樨  뤥 , 㪠뢠  ᨢ ᥬ஢  ᮤ-
 稪 count (㭮 11.13).   ⠪ ࠭ ⢮  -
஢   ᨢ, ६ ᫥ 믮 㭪権 semop  semctl. -
⥬ 㭪 semget  㭪 11.14, ਬ, ᮧ  ᥬ    
⮢.
    ⠪ 맮 ⥬ 㭪樨 semop:

    oldval = semop(id,oplist,count);

  id  -  ਯ,  頥 㭪樥 semget, oplist - 㪠⥫ 
ᯨ᮪ 権, count  -  ࠧ  ᯨ᪠.  頥  㭪樥  祭
oldval  ० 祭 ᥬ, 

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/ipc.h>                                       |
    | #include <sys/sem.h>                                       |
    |                                                            |
    | #define SEMKEY    75                                       |
    | int semid;                                                 |
    | unsigned int count;                                        |
    | /* ।  sembuf  䠩 sys/sem.h          |
    |  * struct sembuf {                                         |
    |  *     unsigned shortsem_num;                              |
    |  *     short sem_op;                                       |
    |  *     short sem_flg;                                      |
    | }; */                                                      |
    | struct sembuf psembuf,vsembuf;    /* 樨 ⨯ P  V */|
    |                                                            |
    | main(argc,argv)                                            |
    |      int argc;                                             |
    |      char *argv[];                                         |
    | {                                                          |
    |      int i,first,second;                                   |
    |      short initarray[2],outarray[2];                       |
    |      extern cleanup();                                     |
    |                                                            |
    |      if (argc == 1)                                        |
    |      {                                                     |
    |          for (i = 0; i < 20; i++)                          |
    |              signal(i,cleanup);                            |
    |          semid = semget(SEMKEY,2,0777|IPC_CREAT);          |
    |          initarray[0] = initarray[1] = 1;                  |
    |          semctl(semid,2,SETALL,initarray);                 |
    |          semctl(semid,2,GETALL,outarray);                  |
    |          printf("砫 祭 ᥬ஢ %d %d\n",    |
    |                 outarray[0],outarray[1]);                  |
    |          pause();    /* ਮ⠭  祭 ᨣ */ |
    |      }                                                     |
    |                                                            |
    |      /* த  ᫥饩 ࠭ */               |
    +------------------------------------------------------------+

       㭮 11.14. 樨 ⠭   ஢


                                    347

 ந .   ᯨ᪠ 権  ᫥-
騩 ଠ:
  *   ᥬ, 騩  ᨢ ᥬ஢,  
    믮 ,
  *  樨,
  * 䫠.

    +------------------------------------------------------------+
    |      else if (argv[1][0] == 'a')                           |
    |      {                                                     |
    |          first = 0;                                        |
    |          second = 1;                                       |
    |      }                                                     |
    |      else                                                  |
    |      {                                                     |
    |          first = 1;                                        |
    |          second = 0;                                       |
    |      }                                                     |
    |                                                            |
    |      semid = semget(SEMKEY,2,0777);                        |
    |      psembuf.sem_op = -1;                                  |
    |      psembuf.sem_flg = SEM_UNDO;                           |
    |      vsembuf.sem_op = 1;                                   |
    |      vsembuf.sem_flg = SEM_UNDO;                           |
    |                                                            |
    |      for (count = 0; ; count++)                            |
    |      {                                                     |
    |          psembuf.sem_num = first;                          |
    |          semop(semid,&psembuf,1);                          |
    |          psembuf.sem_num = second;                         |
    |          semop(semid,&psembuf,1);                          |
    |          printf(" %d 稪 %d\n",getpid(),count); |
    |          vsembuf.sem_num = second;                         |
    |          semop(semid,&vsembuf,1);                          |
    |          vsembuf.sem_num = first;                          |
    |          semop(semid,&vsembuf,1);                          |
    |      }                                                     |
    | }                                                          |
    |                                                            |
    | cleanup()                                                  |
    | {                                                          |
    |          semctl(semid,2,IPC_RMID,0);                       |
    |          exit();                                           |
    | }                                                          |
    +------------------------------------------------------------+

       㭮 11.14. 樨 ⠭   ஢ (த)


     뢠 ᯨ᮪ 権 oplist  ᭮ ࠭⢠  
஢ ४⭮ ஢ ᥬ஢,  ⠪ 稥   -
 ࠧ襭  ⥭  ४஢ ᥬ஢ (㭮  11.15).  ᫨
⠪  ࠧ襭    , ⥬ 㭪 蠥 㤠筮. ᫨
 室 ਮ⠭ ᢮ ࠡ  饭   ᯨ  -
権,    頥  ᥬࠬ  ० 祭  室  ﭨ
ਮ⠭  㯫  ᮡ, ᫥ 祣 ⥬-
 㭪 ᪠ . ᪮  ࠭  権  ᥬ-
ࠬ  쭮 ᯨ᪥,   뢠  ᯨ᮪   ࠭⢠


                                    348

    +------------------------------------------------------------+
    |  semop           /* 樨  ᥬ஬ */      |
    | 室 ଠ:  (1) ਯ ᥬ               |
    |                      (2) ᯨ᮪ 権  ᥬ஬     |
    |                      (3) ⢮ ⮢  ᯨ᪥     |
    | 室 ଠ: 室 祭 ᥬ            |
    | {                                                          |
    |     ஢ ४⭮ ਯ ᥬ;           |
    | start:  ᯨ᮪ 権  ᥬ஬  ࠭-  |
    |         ⢠   ࠭⢮ ;                   |
    |     ஢ 稥 ࠧ襭  믮  - |
    |      権;                                                  |
    |                                                            |
    |      ( 樨  ᯨ᪥)                         |
    |     {                                                      |
    |         ᫨ ( 樨  ⥫쭮 祭)   |
    |         {                                                  |
    |             ਡ  樨  祭 ᥬ;    |
    |             ᫨ (  樨 ⠭ 䫠 UNDO)|
    |                  ᪮४஢  ⠭  |
    |                     ;                    |
    |             뢥  ﭨ ਮ⠭  , |
    |              騥 㢥祭 祭 ᥬ;       |
    |         }                                                  |
    |          ⨢ 砥 ᫨ ( 樨  -|
    |          ⥫쭮 祭)                                 |
    |         {                                                  |
    |             ᫨ ( 樨 + 祭 ᥬ >= 0)   |
    |             {                                              |
    |                  ਡ  樨  祭 ᥬ- |
    |                   ;                                      |
    |                  ᫨ (䫠 UNDO ⠭)               |
    |                       ᪮४஢  ⠭- |
    |                           ;         |
    |                  ᫨ (祭 ᥬ ࠢ 0)          |
    |                       /* த  ᫥饩 ࠭-  |
    |                        *  */                             |
    +------------------------------------------------------------+

      㭮 11.15.  믮 権  ᥬ஬


,    १᪠ ⥬ 㭪.  ࠧ, 樨 -
 ᭮ -     ᥠ   .
      祭 ᥬ  ᨬ   樨.  ᫨  
樨   ⥫쭮 祭,  㢥稢 祭 ᥬ 
뢮  ﭨ ਮ⠭  , 騥  㯫  ⮣
ᮡ.  ᫨   樨 ࠢ 0,  ஢ 祭 ᥬ: ᫨
 ࠢ 0,  室  믮 㣨 権;  ⨢ 砥
 㢥稢 ᫮ ਮ⠭ ᮢ, ,  祭
ᥬ ⠭ 㫥,  "믠". ᫨  樨  ⥫쭮
祭  ᫨  ᮫⭮ 祭  ॢ蠥 祭 ᥬ, 
ਡ  樨 (⥫쭮 ᫮)  祭 ᥬ. ᫨  -
 ࠢ 0,  뢮  ﭨ ਮ⠭  , -
騥 㫥 祭 ᥬ. ᫨ १  ᮫⭮
祭  樨,  ਮ⠭    ,   -
祭 ᥬ  㢥. ᫨  ਮ⠭ । -
樨,   ਮ, ᪠騩 뢠; ᫥⥫쭮, 稢 ᨣ-
,  室  ⮣ ﭨ.

                                    349

    +------------------------------------------------------------+
    |                       뢥  ﭨ ਮ⠭  |
    |                        , 騥 㫥 -|
    |                         ᥬ;                       |
    |                  த;                               |
    |             }                                              |
    |             믮  ந  ᥬ஬     |
    |               ᥠ 樨  ⭮ ᫥-  |
    |              ⥫쭮 (⠭ ஥ 祭 ᥬ- |
    |              );                                        |
    |             ᫨ (䫠   ਮ⠭)       |
    |                    訡;                      |
    |             ਮ⠭ (  ,  祭 - |
    |                㢥);                        |
    |             ३  start;  /*  横  ᠬ  |
    |                                 * 砫 * /               |
    |         }                                                  |
    |          ⨢ 砥    /*  樨 ࠢ  */|
    |         {                                                  |
    |             ᫨ (祭 ᥬ ⫨筮  )       |
    |             {                                              |
    |                  믮  ந  ᥬ஬ |
    |                     ᥠ 樨  ⭮ -  |
    |                   ᫥⥫쭮 (⠭ ஥    |
    |                   祭 ᥬ);                      |
    |                  ᫨ (䫠   ਮ⠭)  |
    |                         訡;                 |
    |                  ਮ⠭ (  ,  祭|
    |                   ᥬ  ⠭ 㫥);             |
    |                  ३  start;  /*  横 */   |
    |             }                                              |
    |         }                                                  |
    |     } /*  横 */                                    |
    |     /*  樨  ᥬ஬ 믮 */             |
    |     ᪮४஢ 祭 ,   ࠭ -|
    |       ᫥ 믮 権  䨪    |
    |      ᮢ;                                            |
    |      室 祭 ᥬ, ⢮襥    |
    |       맮 㭪樨 semop;                          |
    | }                                                          |
    +------------------------------------------------------------+

  㭮 11.15.  믮 権  ᥬ஬ (த)


    ३    ணࠬ,  ।⠢  㭪 11.14,  ।,
 짮⥫ ᯮ  (  a.out)  ࠧ  ᫥饬 -
:
    a.out &
    a.out a &
    a.out b &
    ᫨ ணࠬ 뢠  ࠬ஢,  ᮧ   ᥬ-
஢   ⮢  ᢠ  ᥬ 祭, ࠢ 1. -
⥬  뢠 㭪 pause  ਮ⠭  祭 ᨣ-
, ᫥ 祣 㤠 ᥬ  ⥬ (cleanup).  믮 ணࠬ-
    ࠬ஬  'a'   (A) ந  ᥬࠬ  横 
樨:  㬥蠥   祭 ᥬ 0,   ᠬ   
ᥬ஬ 1, 믮  뢮     㢥稢 祭
ᥬ஢ 0  1. ᫨   ⠫ 㬥 祭 ᥬ, ࠢ-

                                    350

 0,  諮  ਮ⠭, ᫥⥫쭮, ᥬ  
墠祭  (㯭  㬥襭). ᪮ 室 祭 ᥬ-
஢ 뫨 ࠢ 1  ᪮  ᥬࠬ  뫮 饭  ஭ -
 ᮢ,  A   ਮ⠭,  祭 ᥬ஢ -
  ⮫쪮  1  0.  믮 ணࠬ  ࠬ஬ 'b'
 (B) 㬥蠥 祭 ᥬ஢ 0  1  浪, ⭮ 室  -
    A.     A  B 믮 ࠫ쭮, 
᫮ ,  ன  A 墠⨫ ᥬ 0   墠
ᥬ 1,   B 墠⨫ ᥬ 1   墠 ᥬ  0.  
  ३    ﭨ ਮ⠭,    த
᢮ 믮.   ஢,   ன    
 ⮫쪮  祭 ᨣ.
    ⮡  ।    ஡,   -
 ६ ᪮쪮 権  ᥬࠬ.  ᫥  ਬ
 䥪 ⨣  ᯮ짮 ᫥ ஢:

    struct sembuf psembuf[2];

    psembuf[0].sem_num = 0;
    psembuf[1].sem_num = 1;
    psembuf[0].sem_op = -1;
    psembuf[1].sem_op = -1;
    semop(semid,psembuf,2);

Psembuf -  ᯨ᮪ 権, 믮 ६ 㬥襭 祭
ᥬ஢ 0  1. ᫨ -    믮,  ਮ-
⠭.  ,  ਬ, ᫨ 祭 ᥬ 0 ࠢ 1,  祭
ᥬ 1 ࠢ 0,  ⠢  祭 묨    ,  
 ᬮ 㬥  ,  㣮.
    ⠭  䫠  IPC_NOWAIT  㭪樨 semop  ᫥騩 : ᫨
   ⠪ ,    ਮ⠭ ᢮  -
     㢥祭 祭 ᥬ  । ஢
, , ᭨ ⮣ 祭  0,  ᫨  ⮬ 䫠 IPC_NOWAIT
⠭,  室  㭪樨  饭  訡.    ࠧ,
᫨  ਮ⠭   砥  믮 ⤥쭮
樨,  ॠ ᫮ ⨯ ᥬ.
    ᫨  믮   ᥬ஬, 墠뢠  ⮬ -
  ,    蠥 ᢮ ࠡ  ਢ ᥬ  室
ﭨ,    樨. 稭   ⠪
権    訡 ணࠬ஢, ⠪  ᨣ, ਢ騥 
  襭  믮  .  ᫨  ᫥ ⮣,  
㬥 祭 ᥬ஢,   ᨣ  kill,  ⠭  ०
祭  㦥  㤠, ᪮ ᨣ  ⨯  -
 ᮬ. ⥫쭮, 㣨 ,    ᥬ-
ࠬ,  㦠,   ᫥ ஢,  ᠬ ஢訩 
 㦥 ४⨫ ᢮ ⢮. ⮡     -
  権,    㭪樨  semop   ⠭ 䫠 SEM_UNDO;
  ,    室 ᥬ , 믮
ᮬ.  ⮣  ᯮ殮    ⠡,  ன -
   ⥬ ⢥ ⤥쭠  .    ⠡  ᮤন
㪠⥫  㯯  ⠭-
,         ᯮ㥬 ᮬ ᥬ (㭮
11.16).   ⠭ ⮨   ⮢ -  -
䨪 ᥬ,  浪     ⠭筮 祭.
     뤥  ⠭ ᪨,  ६ ࢮ -
 ⥬ 㭪樨 semop  ⠭ 䫠 SEM_UNDO.  ᫥-
  饭    㭪樨   ⥬  䫠  ᬠਢ 
⠭    ᪠   ⥬  ᠬ 䨪-


                                    351

      
          ⠭             ⠭
             +------+
             |  -   |
             |  -   |
             |  -   |
             |  -   |   +----------+   +----------+   +----------+
             +------+   |ਯ|   |ਯ|   |ਯ|
             |      +-->|     +-->|     +-->|     |
             +------+   | 祭 |   | 祭 |   | 祭 |
             |      |   +----------+   +----------+   +----------+
             |      |   +----------+
             +------+   |ਯ|
             |      +-->|     |
             +------+   | 祭 |
             |  -   |   +----------+
             |  -   |
             |  -   |
             |  -   |
             +------+

         㭮 11.16.  ⠭ ᥬ஢


஬  浪 ஬ ᥬ,      ଠ  맮  㭪樨.  ᫨
  㦥,    ⠥  祭 ந  ᥬ஬
樨  ⠭筮 祭.  ࠧ,    ⠭-
 ࠭ १ ⠭ 㬬 祭  権, ந
  ᥬ஬,   ண ⠭ 䫠 SEM_UNDO. ᫨ ᮮ⢥饩
 ,  ᮧ ,   ⮬ ᯨ᮪   -
䨪ࠬ  ࠬ ᥬ஢. ᫨ ⠭筮 祭 ⠭  ࠢ
0,  㤠   ᯨ᪠.   蠥,  뢠-

  +---------------++-------+  +---------------++-------+-------+
  | 䨪 ||       |  | 䨪 ||       |       |
  |   ᥬ    || semid |  |   ᥬ    || semid | semid |
  +---------------++-------+  +---------------++-------+-------+
  |  ᥬ||   0   |  |  ᥬ||   0   |   1   |
  +---------------++-------+  +---------------++-------+-------+
  |  ⠭筮 ||       |  |  ⠭筮 ||       |       |
  |    祭   ||   1   |  |    祭   ||   1   |   1   |
  +---------------++-------+  +---------------++-------+-------+

   () ᫥ ࢮ 樨       () ᫥ ன 樨

  +---------------++-------+
  | 䨪 ||       |
  |   ᥬ    || semid |
  +---------------++-------+
  |  ᥬ||   0   |                  
  +---------------++-------+
  |  ⠭筮 ||       |
  |    祭   ||   1   |
  +---------------++-------+

   () ᫥ 쥩 樨      () ᫥ ⢥⮩ 樨

 㭮 11.17. ᫥⥫쭮 ﭨ ᯨ᪠  ⠭


                                    352



  ᯥ樠  楤,   ᬠਢ  易  ᮬ
 ⠭  믮  㪠 ᥬ஬  ᫮-
 ⢨.
     ᮧ  ⠭ 直 ࠧ,   㬥-
 祭 ᥬ,  㤠 ,   㢥稢 祭 ᥬ-
, ᪮ ⠭筮 祭
 ࠢ 0.  㭪 11.17    ᫥⥫쭮  ﭨ
ᯨ᪠   믮 ணࠬ  ࠬ஬ 'a'. ᫥ ࢮ -
樨    ,   䨪 semid, -
  ᥬ, ࠢ 0,  ⠭筮 祭, ࠢ 1,  ᫥ ன
樨     ஬ ᥬ, ࠢ 1,  ⠭-
 祭, ࠢ 1. ᫨   蠥,  -
  ᥬ ࠬ  ਡ   ᥬ   ,  -
   祭  0.  ⭮ 砥  㬥蠥 ⠭筮 -
祭  ᥬ 1  쥩 樨,  ᮮ⢥⢨  㢥祭  -
祭 ᠬ ᥬ,  㤠   楫, ᪮ ⠭-
  祭 ⠭ 㫥. ᫥ ⢥⮩ 樨   
  ⠭, ᪮  ⠭ 祭 ⠫ 㫥-
묨.
     樨  ᥬࠬ      -
,  뫮  ,   ।⠢  㤭 
    ॠ樨,   設⢥ ਫ    -
⥩   易⥫. ணࠬ, 뢠騥 ॡ    -
짮   ᥬ஢, ⠫    -
஢  짮⥫᪮ ஢,   㦥  室  ন
⠪ ᫮  ⥬ 㭪権.
    ⠪ 맮 ⥬ 㭪樨 semctl:

    semctl(id,number,cmd,arg);

    ࠬ arg   ꥤ ⨯ :

    union semunion {
          int val;
          struct semid_ds *semstat; /* ᠭ ⨯ .   -
                                     *  */
          unsigned short *array;
    } arg;

        ࠬ  arg   ᨬ  祭 ࠬ
cmd,  ⮬,    ioctl ( 10).   -
,     ᯮ짮  ࠬ cmd:   ⠭
祭 ࠢ ࠬ஢ (ࠢ 㯠  .),  ⠭  祭
   ᥬ஢  ,  祭 ᥬ஢. ஡-
    ⢨ ᮤঠ  ਫ. ᫨ 㪠  㤠-
, IPC_RMID,     ᮢ, ᮤঠ  -
   ᥬ,  㤠 ᮮ⢥騥   -
. ⥬  樠 ᯮ㥬 ᥬ஬     -
  ﭨ ਮ⠭  , 騥 㯫 -
 易  ᥬ஬ ᮡ:    ᢮ 믮-
,  㦨,  䨪 ᥬ    ४-
,   뢠饩 ணࠬ 訡.


        11.2.4 騥 砭

    堭  㭪樮஢  䠩  ⥬  堭 ⢨

                                    353

ᮢ    . ⥬ 㭪樨 ⨯ "get" 宦  㭪-
樨 creat  open, 㭪樨 ⨯ "control" ।⠢    㤠
ਯ   ⥬, 祬 宦  㭪 unlink.   ,  -
 ⢨ ᮢ  樨,  ,
믮塞 ⥬ 㭪樥 close.  ⥫쭮,      ᯮ
ᢥﬨ   ⮬,    ᯮ짮 堭 IPC, , -
⥫쭮,   ਡ  㣠 ⮣ 堭, ᫨ ࠢ쭮
㣠뢠 ᮮ⢥騩 䨪  ᫨        室
ࠢ 㯠,  ᫨   믮 ।⥫쭮 㭪 ⨯ "get".
   ⮬᪨  ᯮ㥬  堭 -
⢨  ᮢ,  ᪮    ⭮,     
  㦭.  ࠧ, 訢訥 ᫥⢨  訡-
   ⠢ ᫥ ᥡ 㦭   ᯮ㥬  ,
ॣ㦠騥    騥 ⥬. ᬮ  ,    -
 ⢨ ᫥ 襭 ⢮    -
࠭ ଠ  ﭨ  ,  -⠪     楫  -
짮 䠩.
     ࠤ樮, 稢 ப ࠭ 䠩 堭
⢨  ᮢ  ᯮ   ࠭⢮ , 饥 
祩 (keys).  ᥬ⨪ 祩    쭮 㤭,  -
  ࠧ 設   뢠 ࠧ ꥪ.  -
,   ᭮ ।祭  ᯮ짮  設 -
.   䠩  襩 ⥯ 室  । ⥬ (.
 13). ᯮ짮 祩   䠩 ⠪  ᢨ⥫  
⮬,  ।⢠ ⢨ ᮢ  "  ᥡ", 
  ᯥ樠 ਫ,   饩  ⥩, 묨 -
, ਬ,   䠩.      㭪樮  ⥩,
।⠢塞  묨 ।⢠,   ॠ   㣨
⥬ ।, ⮬    ⠢     ᫥  .
  ,  ᯮ짮  ⠢ ⮢ ਪ ணࠬ ᭮
⢨  訥 १  ࠢ  ⠭묨 䠩묨
।⢠ (. ࠦ).


        11.3   

    ணࠬ, ন騥 設 , ⠪,  ஭ -
, ணࠬ ⠭樮 뫪 䠩  㤠 ॣ樨, -
 ᯮ  ⢥ ᯥ樠 । ࣠樨 祭  -
ଠ樮  .  ,  ਬ,  ⠭ ணࠬ, ࠡ騥 
⠢ ஭ , ࠭ ⥪ ⮢ ᮮ饭 짮⥫ 
⤥쭮   䠩   (   짮⥫   "mjb"      䠩       
"/usr/mail/mjb").    짮⥫ 뫠 㣮 ⮢ ᮮ-
    設, ணࠬ mail ()  ᮮ饭   䠩-
 , ᯮ  楫 ࠭ 楫⭮ ࠧ  騥
  ६  䠩.    砥 , ணࠬ mail 뢠
ਭ騩  ⮢ 䠩  ⠥ ᮮ饭.  ⮣, ⮡  ᫠
ᮮ饭    設, ணࠬ mail   筮 ⮣ ᪠
  ᮮ⢥騩 ⮢ 䠩. ᪮ ணࠬ    ࠡ
 㤠묨 䠩 ।⢥, , ⥪騩  㣮 設,
 ⢮  ⢥  쭮 ⮢ ; ᫥-
⥫쭮,  쭮  室 ᯮᮡ 裡  ᢮ 㤠 -
⮬ १ 設 ࠭.    ⮬ 㤠-
 㦨饣 (ࢥ୮) .
    ᪮  ⥬ UNIX   ᮧ      ⥬
㭪樨 fork,  ⮬ ,   ⠥ 믮 祭,
㦨騩  㦥  ⢮. ᫨    ᮧ -
  㤠  砫   祭 (  -
設 裡),   ᮣᮢ  ⥪ன ⥬. ⮡

                                    354

 ⮣,  , 筮 init, ஦ 㦨騩 ,
   ⥭   裡,   砥   㦨-
, ᫥ 祣  ᮮ⢥⢨    ⮪  믮  ⠭
ᮥ.  롮  ⥢  ।  ⮪ 筮 믮 ணࠬ
  ࢥ, ᭮뢠  ଠ樨, ࠭饩  ਪ  
;   㣮 ஭, ࠭ 짮⥫ ।⢠   -
஢  ᠬ ணࠬ.
     ⢥ ਬ ᬮਬ ணࠬ uucp,  㦨  -
뫪  䠩    ᯮ   㤠 (. [Nowitz 80]). -
- 訢          ଠ
(ਬ,   ⥫䮭), 뢠 ⮪, 뢠  ஢-
 ଠ  ਯ 뢠 䠩  뢠 㤠  -
.  設   ᯥ樠 , 뤥  ᯮ짮-
  ணࠬ  uucp; 믮騩  ⮩ 設  init ஦
getty- - ࢥ,  ࠢ ﬨ    饭  
祭. ᫥ 믮 ⭮ 祭 - ॣ-
    ⥬    ᮮ⢥⢨      ⮪  ॣ樨:
getty- ᪠ ᯥ樠  , uucico,  㪠
  䠩 "/etc/passwd",  - ।  㤠 設 ᫥-
⥫쭮 , ⥬ ᠬ ⠢  ᯮ    -
쭮 設.
    ⥢ ⢨  ⥬ UNIX ।⠢  쥧  ஡,
᪮  ᮮ饭    ᥡ  ଠ樮, ⠪  ࠢ-
 .  ࠢ饩  ᮮ饭  ᯮ  -
祭 ᮮ饭.  ᢮ ।,        ⨯
  ᯮ㥬 ⮪. ⥫쭮, ᠬ 㦭  ⨯ -
,      ࠧ१  ⥬ ਭ樯,  ஬ 짮⥫  
   ⨯ 䠩,   ன⢠  짮⥫  룫-
    䠩.  ࠤ樮 ⮤ ॠ樨 ⥢ ⢨ 
⠭ ࠢ ࠬ஢  ᨫ쭮 ⥯    -
⥬ 㭪樨 ioctl,   ࠧ ⨯ ⥩      頥
-ࠧ.   ⥫  䥪, 易  ⥬,
 ணࠬ, ࠧࠡ⠭   ,  㣨    ࠡ-
.
    ⮡  ࠧࠡ ⥢ 䥩  ⥬ UNIX, 뫨 ।ਭ
⥫ ᨫ.  ⮪  ᫥ । ᨨ V  -
   堭 প ⥢ ⢨, ᯥ-
騬  ⠭ ⤥ 㫥 ⮪   ᮣᮢ  -
짮  ஢ . 騩 ࠧ 饭 ⪮ ᠭ -
⮤  襭    ஡    ⥬ BSD, ᭮  ᯮ짮
.


        11.4 

     ।饬 ࠧ 뫮 ,  ࠧ   
ᮡ  , ⥪騥  ࠧ 設,  ⮬ 頫 
 ,  ᯮᮡ ॠ樨 ⢨   ࠧ   -
ᨬ  ᯮ㥬 ⮪  ⥢ ।.  ⮣,  ᯮ-
   ᥣ ਬ  㦨 ⢨ ᮢ, 믮-
    ⮩  設, ᪮   । ⢮
㦨饣 (ࢥ୮) ,   믮 ⥬ 㭪-
権 open  read 㤥 ਮ⠭ ࠩ஬.  楫 ᮧ 
㭨ᠫ ⮤ ⢨ ᮢ  ᭮ ᯮ짮  -
஢  ⥢ ⮪  ⥬ BSD  ࠧࠡ⠭ 堭, -
稢訩  "sockets" () (. [Berkeley 83]).     ࠧ
 ᬮਬ  ᯥ ਬ  ( 짮⥫᪮ ஢
।⠢).


                                    355

               -       -ࢥ
                       |                 |
                       +--+           +--+
+-------------------------+--+     +--+--------------------------+
| ஢               |     |          ஢       |
+-------------------------+--+     +--+--------------------------+
|                        TCP |     | TCP                         |
| ஢ ⮪      |  |     |  |       ஢ ⮪ |
|                        IP  |     | IP                          |
+-------------------------+--+     +--+--------------------------+
|                     ࠩ|     | ࠩ                     |
| ஢ ன  Ethernet|     |Ethernet  ஢ ன  |
+-------------------------+--+     +--+--------------------------+
                          +---+   +---+
                              |   |
                                

           㭮 11.18.   ᯮ짮 

         ஢: , ⮪  ன (㭮
11.18). ஢  믮 㭪樨 䥩  饭ﬨ   -
樮  ⥬ (⥬ 㭪)  ।⢠  ஢, ஢
⮪ ᮤন 㫨, ᯥ稢騥 ⢨ ᮢ (  -
㭪  㯮 ⮪ TCP  IP),  ஢ ன ᮤন ࠩ,
ࠢ騥 ⥢묨 ன⢠. ⨬ ⠭ ⮪  ࠩ-
஢ 㪠뢠  ஥ ⥬ ( ᥪ樨 䨣樨);   ᯮᮡ
㯠    㯮⮬ ⮪ 堭.  -
  ᮡ  奬 -ࢥ: ࢥ  ᨣ  ,
室    㯫᭮  裡,   -  -
   ࢥ஬ १ , 室饥  㣮 ,  -
 ᯮ  㣮 設.  ᯥ稢 ७   -
।     ࢥ.
    , 騥 묨 ᢮⢠, ਬ, 騥   -
騥  ᮣ襭  䨪樨  ଠ ᮢ ( ⮪), 㯯-
   (ࠢ塞  㧫).  ⥬  BSD  4.2  ন
:  "UNIX  system" -  ⢨ ᮢ   設 
"Internet" (⥢) -  ⢨ १     ⮪
DARPA  (ࠢ ᯥ⨢ ᫥  ࠧࠡ⮪ ⢠ -
஭ ) (. [Postel 80]  [Postel 81]).  뢠  ⨯:  -
    (⮪  , ᫨ 짮 ନ ફ) 
⠣ࠬ. 㠫  ᯥ稢  ⠢    -
࠭  室  ᫥⥫쭮.  ⠣ࠬ  ࠭ 
⠢  ࠭ 㭨쭮  ᫥⥫쭮,     -
   ᫥ ᯮ짮 ᮢ, ᪮    ॡ ᫮-
 ⠭ 樨; ⠪ ࠧ, ⠣ࠬ      ⤥
 ⢨.   ⨬ 樨 ⨯ - 
⥬  ন  㬮砭   ᯮ㥬 ⮪. , ਬ,
  "Internet" 㣨 㠫쭮  믮  ⮪  ࠭-
⭮  裡 (TCP),  㭪樨 ⠣ࠬ - 짮⥫᪨ ⠣ࠬ
⮪ (UDP).
     ᪮쪮 ⥬ 㭪権 ࠡ  . 㭪 socket
⠭    裡.

    sd = socket(format,type,protocol);

Format 砥  ("UNIX system"  "Internet"), type - ⨯ 裡 -
१  (㠫   ⠣ࠬ),  protocol - ⨯  ⮪,
ࠢ饣  ⢨.  ਯ   sd, 頥 㭪樥
socket, ᯮ 㣨 ⥬묨 㭪ﬨ. ⨥   믮

                                    356

㭪 close.
    㭪 bind 뢠 ਯ   :

    bind(sd,address,length);

  sd - ਯ , address -  , ।饩 -
䨪, ࠪ   樨     ⮪  (  㭪樨
socket). Length -   address;  ⮣ ࠬ   
,      , ᪮  ࠧ   ⮪ 
  ࠧ筮. ਬ,   "UNIX system"   ᮤন
  䠩. -ࢥ 뢠       -
襬 ᢮  ᠬ-⠬.
      ⥬ 㭪樨 connect    祭  -
饬 :

    connect(sd,address,length);

᪨  ࠬ஢ 㭪樨 ⠥ ० (. 㭪  bind),
  address 㪠뢠 㦥  室 , ࠧ饥 ⨢ -
  裡.    ᯮ짮        -
 裡,  ⮣  㤮⮢ ࠢ쭮 ⠭  裡. ᫨
⨯    - ⠣ࠬ, ᮮ頥 㭪樥 connect   㤥 -
짮  ᫥ 饭  㭪樨 send १  ;  
 맮  ᮥ  ந.
     -ࢥ ⮢  ਥ 裡  㠫쭮 , -
  ᫥  ந 㯠騥   ।  㦨. -
쭠  ।    ⥬ 㭪樨 listen:

    listen(sd,qlength)

 sd - ਯ ,  qlength - ᨬ쭮-⨬ ᫮  -
ᮢ,  ࠡ⪨.


    +--------------------+         +-------------------------+
    |   -   |         |     -ࢥ      |
    |         |          |         |          |  -           |
    |         |          |         |     +----+  ------      |
    |         |          |         |     |            -      |
    |         |          |         |listen addr   accept addr|
    +---------+----------+         +-----+-------------------+
              |                          |            -
              +--------------------------+-------------

               㭮 11.19. ਥ 맮 ࢥ஬


    ⥬  㭪  accept ਭ   祭, 㯠騥
 室 -ࢥ:

    nsd = accept(sd,address,addrlen);

 sd - ਯ , address - 㪠⥫  짮⥫᪨  ᨢ,
  ஬    頥    砥 , addrlen - ࠧ
짮⥫᪮ ᨢ.  襭 믮 㭪樨   뢠
 ६ addrlen ࠧ ࠭⢠, 䠪᪨ ⮣ ᨢ. -
  頥   ਯ  (nsd), ⫨  ਯ sd.
-ࢥ  த ᫥  ﭨ   ,
ন   ⮬  ⤥쭮  (㭮 11.19).

                                    357

    㭪樨 send  recv 믮 ।  १ 祭 .
⠪ 맮 㭪樨 send:

    count = send(sd,msg,length,flags);

  sd  - ਯ , msg - 㪠⥫  뫠 , length -
ࠧ , count - ⢮ 䠪᪨ । . ࠬ flags
 ᮤঠ 祭 SOF_OOB (᫠  out-of-band - "१ ⠬-
"), ᫨ 뫠   뢠   饬  ଠ樮  
 騬 ᠬ. ணࠬ 㤠 ॣ樨, -
,   ᫠ out-of-band ᮮ饭, 饥 ⨥  
ନ  "delete". ⠪ 맮 ⥬ 㭪樨 recv:

    count = recv(sd,buf,length,flags);

 buf - ᨢ  ਥ , length -  ꥬ , count -
⢮ , 䠪᪨  ।  짮⥫᪮  ணࠬ.  
(flags)   ⠭ ⠪ ࠧ,  㯨襥 ᮮ饭 -
 ⥭    ᮤন  㤥 㤠  ।,  -
  祭  out-of-band.  ⠣ࠬ  㪠 㭪-
権, sendto  recvfrom,  ⢥ ⥫ ࠬ஢ 㪠뢠 -
.  ᫥ 믮 祭   ⮪ ⨯  
 㭪権 send  recv ᯮ짮 㭪樨 read  write.  ࠧ,
ᮣᮢ ⨯ ⮪, ࢥ    ஦  ,  ࠡ騥
⮫쪮  㭪ﬨ read  write, ᫮    묨 䠩.
    㭪 shutdown 뢠  :

    shutdown(sd,mode)

 mode 㪠뢠,   ஭ (뫠饩, ਭ饩   -
)  뭥  饭  ⨥   । . 㭪 ᮮ頥
ᯮ㥬 ⮪  襭 ᥠ ⥢ ⢨,  ⠢-
,  ⥬    ,  ਯ   ਪ᭮. ᢮
ਯ  ⮫쪮  १ 믮 㭪樨 close.
    ⥬ 㭪 getsockname 砥   裡,  ⠭-
 ࠭   㭪樨 bind:

    getsockname(sd,name,length);

    㭪樨  getsockopt   setsockopt   ⠭ 祭 ࠧ-
 易   ࠬ஢  ᮮ⢥⢨  ⨯   -
.
    ᬮਬ 㦨 ணࠬ,  ।⠢    㭪  11.20.
  ᮧ   "UNIX system"  ⮪ ⨯  ᢠ
  sockname. ⥬   㭪樨 listen ⠭   -
।  㯠 ᮮ饭  稭 横  㯫 ᮢ.
㭪 accept ਮ⠭ ᢮ 믮   ,   ⮪
 㤥 ॣ஢   祭    祭 ;
᫥  ⮣ 㭪 蠥,  㯨襬   -
ਯ . -ࢥ ஦ ⮬, १ ண  㤥  -
ন   ᮬ-⮬; த⥫  ⮬  ⮬ 뢠-
  ᢮ ਯ, ⮡   ⠭ 宩  㭨樮
䨪 㣮 . -⮬  ࠧ  ⮬    -
蠥 ᫥ 室  㭪樨 read. -ࢥ -
  砫 横   㯫 ᫥饣   祭.
      㭪  11.21    ਬ -, 饣 饭 
ࢥ஬.  ᮧ   ⮬  ,    ࢥ,    뫠
    祭     sockname.  १ 祭


                                    358

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/socket.h>                                    |
    |                                                            |
    | main()                                                     |
    | {                                                          |
    |     int sd,ns;                                             |
    |     char buf[256];                                         |
    |     struct sockaddr sockaddr;                              |
    |     int fromlen;                                           |
    |                                                            |
    |     sd = socket(AF_UNIX,SOCK_STREAM,0);                    |
    |                                                            |
    |     /*   -    ⮩ ᨬ */     |
    |     bind(sd,"sockname",sizeof("sockname") - 1);            |
    |     listen(sd,1);                                          |
    |                                                            |
    |     for (;;)                                               |
    |     {                                                      |
    |                                                            |
    |          ns = accept(sd,&sockaddr,&fromlen);               |
    |          if (fork() == 0)                                  |
    |          {                                                 |
    |              /* ⮬ */                                 |
    |              close(sd);                                    |
    |              read(ns,buf,sizeof(buf));                     |
    |              printf("ࢥ ⠥ '%s'\n",buf);           |
    |              exit();                                       |
    |          }                                                 |
    |          close(ns);                                        |
    |     }                                                      |
    | }                                                          |
    +------------------------------------------------------------+

        㭮 11.20. -ࢥ   "UNIX system"

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/socket.h>                                    |
    |                                                            |
    | main()                                                     |
    | {                                                          |
    |    int sd,ns;                                              |
    |    char buf[256];                                          |
    |    struct sockaddr sockaddr;                               |
    |    int fromlen;                                            |
    |                                                            |
    |    sd = socket(AF_UNIX,SOCK_STREAM,0);                     |
    |                                                            |
    |    /*     祭          |
    |    /* ⮩ ᨬ */                                     |
    |    if (connect(sd,"sockname",sizeof("sockname") - 1) == -1)|
    |         exit();                                            |
    |                                                            |
    |    write(sd,"hi guy",6);                                   |
    | }                                                          |
    +------------------------------------------------------------+

         㭮 11.21. -   "UNIX system"

                                    359



- 砥 㠫  裡  ࢥ஬.   ᬠਢ-
 ਬ  ।  ᮮ饭  蠥.
    ᫨ ࢥ 㦨   , 㪠  ⮬,   -
  "Internet",  ᤥ ᫥騬 ࠧ:

    socket(AF_INET,SOCK_STREAM,0);

  易  ⥢ ᮬ, 祭  ࢥ.  ⥬ BSD 
 㭪樨, 믮騥  ⢨. ன  ࠬ  뢠
⮬ 㭪樨 connect ᮤন  ଠ, 室  -
䨪樨 設   (  ⮢ 뫪 ᮮ饭 १ ஬-
 設),  ⠪ ⥫ ଠ,  ਥ-
   設-. ᫨ ࢥ 㦭 ६ ᫥  -
ﭨ   믮  ᮢ,  ᯮ    
 㭪樨 select ।,   ⮬ ⠭   
 .


        11.5 

      ᬮ५  ᪮쪮  ⢨ ᮢ. ࢮ ମ,
襩 砫 㦤,  ஢ ᮢ - ⢨
 ᮢ, 㯠饥  ⢥  ।⢠ ⫠  ணࠬ.
   ᢮ २⢠ ஢ ᮢ   㭪樨 ptrace
  筮 ண饥  ਬ⨢ ய⨥, ᪮  
ᥠ 㭪 ᯮᮡ । ண ࠭祭 ꥬ ,  ॡ
讥  ⢮  ४祭  ⥪,  ⢨ ࠭稢
⮫쪮 ମ ⭮襭 த⥫-⮬,  , ᠬ ஢ ந-
 ⮫쪮   ᮣ    ᮢ.  ᨨ V
⥬ UNIX   ⢨ ᮢ (IPC), 騩  ᥡ
堭  ᮮ饭ﬨ, ࠡ  ᥬࠬ  ࠧ .  -
,   堭  㧪ᯥ樠쭮 祭,    -
襩  몮  㣨 ⠬ 樮 ⥬     -
.   ,  ᯮ   ਫ     ࠢ  
㣨 奬 ⫨  ᮪ 䥪⨢.
    ⥬  UNIX ন ப ᯥ ᫨⥫ ⥩. ࠤ-
 ⮤ ᮣᮢ ⮪  ᨫ쭮 ⥯    
⥬ 㭪樨 ioctl,   ࠧ ⨯ ⥩  ॠ -ࠧ-
.  ⥬ BSD  ⥬ 㭪樨  ࠡ  , -
騥   㭨ᠫ  ⥢ ⢨.  饬 
 V ।  ᠭ    10  ⮪  堭,
騩 ᮣᮢ ࠡ  .


        11.6 

  1.  ந  ⮬ 砥, ᫨  ணࠬ debug 㤥 ⢮
     맮 㭪樨 wait (㭮 11.3) ? (:   室.)
  2.      㭪樨  ptrace  ⫠稪 뢠   ࠭⢠
     㥬    ᫮   .   -
      ᫥ ந   樮 ⥬  ⮣, ⮡ 㢥-
      ⢮ 뢠 ᫮ ?    ⮬ 室-
      ᤥ  ᠬ 㭪樨 ptrace ?
  3.     ⢨ 㭪樨 ptrace ⠪, ⮡  ⢥ -
      pid  뫮 㪠뢠 䨪 ,    饣
     ⮬ ⥪饣 . 㬠  ᠬ, 易묨  -
     ⮩ ଠ樨:   ⥫⢠    

                                    360

        ᭮ ࠭⢠ 㣮, ந쭮 
     ?    ⥫⢠ ࠧ蠥    ᭮ -
     ࠭⢮ 㣮  ?
  4. ࣠  㭪権 ࠡ  ᮮ饭ﬨ ⥪ 짮⥫᪮-
      ஢  ᯮ짮  䠩,    -
     ⮢ ஢.   ।  ᮮ饭,  ன  ࠢ騩
     䠩      ଠ樨  ﭨ ।;  䠩 
      । 墠 䠩  㣨 㤮   堭. -
     뫠 ᮮ饭  ⨯, ᮧ      
     ᮮ饭 ⮣ ⨯, ᫨ ⠪    뫮,  । -
     饭 १  ( ⮬ । ). ࠢ騩 䠩 -
      ᮮ⭮ ⨯ ᮮ饭    .  ⥭
     ᮮ饭 ࠢ騩 䠩 ࠢ   ᮮ⢥饬 -
       . ࠢ  奬  堭, ᠭ  -
     饩 ,  䥪⨢, ᫮ ॠ樨  㭪樮 -
     .
  5.  ⢨ ⠥ 믮 ணࠬ, ।⠢   㭪
     11.22 ?
 *6.    ணࠬ,   砫   ࠧ塞 
     ᫨誮   設 ⥪   﫠  ⥪  㢥-
      ᥪ ࠭ ࠧ塞 .      ந
     ⠫쭠 訡  ?
  7.   ᯮ    ணࠬ,  ।⠢    㭪  11.14,  䫠
     IPC_NOWAIT, ॠ ᫮ ⨯ ᥬ. த,    
      ⮣     ஢.
  8. ,  樨  ᥬࠬ ⨯ P  V ॠ  ࠡ
       묨  .    ॠ  P ᫮
     ⨯ ?
  9. ⠢ ணࠬ 墠 ᮢ,  ᯮ騥  ()  
     ,  () ⥬ 㭪樨 creat  unlink, () 㭪樨  ᮮ-
     饭ﬨ. ஢ ࠢ⥫   䥪⨢.
 10.  ࠪ᪨ ਬ ࠡ  묨  ࠢ  -
     䥪⨢  ᯮ짮 㭪権  ᮮ饭ﬨ,   ஭,
      㭪ﬨ read  write,  㣮.
 11. ࠢ   ணࠬ ᪮ ।   ࠡ 
     ࠧ塞    ᯮ짮 堭    ᮮ饭ﬨ.
     ணࠬ,  ᯮ騥 ࠧ塞 ,  ᨭ஭樨 -
      権 ⥭-    ᥬ.

    +------------------------------------------------------------+
    | #include <sys/types.h>                                     |
    | #include <sys/ipc.h>                                       |
    | #include <sys/msg.h>                                       |
    | #define ALLTYPES 0                                         |
    |                                                            |
    | main()                                                     |
    | {                                                          |
    |    struct msgform                                          |
    |    {                                                       |
    |        long mtype;                                         |
    |        char mtext[1024];                                   |
    |    } msg;                                                  |
    |    register unsigned int id;                               |
    |                                                            |
    |    for (id = 0; ; id++)                                    |
    |        while (msgrcv(id,&msg,1024,ALLTYPES,IPC_NOWAIT) > 0)|
    |              ;                                             |
    | }                                                          |
    +------------------------------------------------------------+

                                    361
