IFS

18. open関数の学習(1)

先の RPGIFSWRT のソースでは

FD = open('/tmp/hello.txt': O_CREAT + O_TRUNC + O_WRONLY + 
             O_CCSID : O_RDWR : EBC_CCSID);   

のようにしてopenという関数が使われていた。
このopen関数をもう少し調べてみよう。
open関数は

   /COPY QSYSINC/QRPGLESRC,IFS

と書かれている IFSというソースを見ると
さらに

   /COPY QSYSINC/QRPGLESRC,SYSTYPES
   /COPY QSYSINC/QRPGLESRC,SYSSTAT 
   /COPY QSYSINC/QRPGLESRC,FCNTL   
   /COPY QSYSINC/QRPGLESRC,UNISTD  
   /COPY QSYSINC/QRPGLESRC,ERRNO   

と記述されており

    /IF DEFINED(LARGE_FILES)                                              
   D open_function   C                   'open64'                         
    /ELSE                                                                 
   D open_function   C                   'open'                           
    /ENDIF                                                                
   D open            PR            10I 0 EXTPROC(*CWIDEN : open_function) 
   D  path                           *   VALUE OPTIONS(*STRING)           
   D  oflag                        10I 0 VALUE                            
   D  mode                               VALUE LIKE(mode_t)               
   D                                     OPTIONS(*NOPASS)                 
   D  conversion_id...                                                    
   D                               10U 0 VALUE                            
   D                                     OPTIONS(*NOPASS)                 
   D  text_file_creation_conversion_id...                                 
   D                               10U 0 VALUE                            
   D                                     OPTIONS(*NOPASS)  

のようにしてopen関数のプロトタイプが定義されている。
openという関数がプロシージャーであるならば
どこかのサービス・プログラム(*SRVPGM)内に存在していて
コンパイルではそれをバインドしなければならないが

   BNDDIR('QC2LE')

という記述によってバインド・ディレクトリーQC2CLEの中から
プロシージャーopenが探し出される。
バインド・ディレクトリー とはライブラリー・リストのようなもので
サービス・プログラムの検索のために使用されるディレクトリーである。

そこで

    DSPSRVPGM RPGIFSWRT

を実行してバインドしているサービス・プログラムを調べてみると

                                プログラム情報の表示
                                                                       画面 7 の 4
      プログラム . . . . . . :   RPGIFSWRT     ライブラリー . . . . . :   TEST.COM
      所有者 . . . . . . . . :   QTR                                              
      プログラム属性 . . . . :   RPGLE                                            
      詳細 . . . . . . . . . :   *SRVPGM                                          


      オプションを入力して,実行キーを押してください。
        5= 表示                                                                   

      OPT  サービス・プログラム  ライブラリー      活動化      記号                           
            QRNXIE        QSYS        *IMMED      D8D9D5E7C9C540404040404040404040
            QLEAWI        QSYS        *IMMED      44F70FABA08585397BDF0CF195F82EC1
            QP0LLIB1      QSYS        *IMMED      D8D7F0D3D3C9C2F14040404040404040

と表示されるが、この3つのサービス・プログラムのうちのひとつ:QP0LLIB1

5=表示 (DSPSRVPGM QP0LLIB1 ) でさらに調べてみると

                             サービス・プログラム情報の表示
                                                                        画面 10 の 5
      サービス・プログラム . . . . . . . . . . :   QP0LLIB1                         
        ライブラリー . . . . . . . . . . . . . :     QSYS                           
      所有者 . . . . . . . . . . . . . . . . . :   QSYS                             
      サービス・プログラム属性 . . . . . . . . :   CPPLE                            
      詳細 . . . . . . . . . . . . . . . . . . :   *PROCEXP                         

                             プロシージャーのエクスポート :

       プロシージャー名                                                       ARGOPT
      lseek                                                                   *NO   
      lstat                                                                   *NO   
      mkdir                                                                   *NO   
      open                                                                    *NO   
      opendir                                                                 *NO   
      pathconf                                                                *NO   
      read                                                                    *NO   
      readdir                                                                 *NO   
      readlink                                                                *NO   
      readv                                                                   *NO   

のようにプロシージャーとしてのopenが見つかる。
このようにしてopenはプロシージャーであることを突き止めたのだが
もう一方でopenは C言語( C/400 ) の関数でもある。
つまり IBM i では C言語の関数とはプロシージャーであるのだ。
C言語の関数がプロシージャーであれば RPGからも C言語の関数を利用できるのは
当然である。
このようにして異なる開発言語のあいだを相互に利用できるのが
ILE (=Integlated Language Enviroment)と呼ばれる統合化開発環境である。

ILE という概念を実感して頂けたことと思う。