MES(H8/OS 5.0) システムコールリファレンス

ファイルやデバイスへアクセスをするシステムコール群

システムでサポートされているファイルシステムに依存することなく、ファイルをアクセスすることができる。
ファイル名の指定は相対パス、または、絶対パスで指定する。
絶対パスを指定する場合は、ファイルシステムが構築されているデバイス名から指定する。
例えば、RAMディスク(ram0)にある"sample"というファイルを指定する場合は、"/ram0/sample"と指定する。
ファイルだけでなく、システムに組み込まれてデバイスドライバにもアクセスができる。
ただし、システムで標準で使うデバイスについては、ユーザープログラムからは使うことができない。
例えば、デフォルトで標準入出力になっているsci1(SCI#1)、ネットワークデバイスであるne0(NE2000イーサネット)、ディスクデバイスなどである。
標準入出力を使う場合はデバイスをオープンする必要はなく、標準出力のデバイス識別子は0、標準入力のデバイス識別子は1を指定する。
現段階で標準でサポートされているデバイスとデバイス名称は以下のとおりである。
なお、デバイス名称の後尾の番号はデバイスのマイナー番号となり、その番号はシステム構成に依存する。
  1. int write(int fd, char *data, int size)
    #include <mes.h>
  2. ファイル/デバイスへの書き込み

    fd:openシステムコールで取得したファイル識別子
    data:書き込むデータのポインタ
    size:書き込むデータの大きさ
    戻り値:書き込んだデータ数、失敗時は-1

  3. int read(int fd, char *data, int size)
    #include <mes.h>
  4. ファイル/デバイスからの読み込み

    fd:openシステムコールで取得したファイル識別子
    data:読み込むデータのポインタ
    size:読み込むデータの大きさ
    戻り値:読み込んだデータ数、失敗時は-1

  5. int open(char *name, int opt)
    #include <mes.h>
  6. ファイル/デバイスをオープンする

    name:ファイルまたはデバイス名称
    opt:オプション
    戻り値:ファイル識別子、失敗時は-1

    対象がファイルの場合、新規作成書き込みは0、追加書き込みはAPPEND_FILE、読み込みはREAD_FILEを指定する。
    デバイスの場合は、通常0を指定する。

  7. int close(int fd)
    #include <mes.h>
  8. ファイル/デバイスをクローズする

    fd:openシステムコールで取得したファイル識別子
    戻り値:0、失敗時は-1

  9. int seek(int fd, int position)
    #include <mes.h>
  10. ファイル/デバイスをシークする

    fd:openシステムコールで取得したファイル識別子
    position:シークさせる位置
    戻り値:0、失敗時は-1

  11. int ioctl(int fd, int data, int op)
    #include <mes.h>
  12. デバイスを制御、または、ファイル/デバイス情報の取得
    実装に関しては、それぞれのファイルシステムやデバイスに依存をする。

    fd:openシステムコールで取得したデバイス識別子
    data:制御や情報取得に必要なデータ領域のポインタ
    op:制御や情報取得を指定させる命令
    戻り値:実装に依存、失敗時は-1

    各デバイスで必ず実装されている命令としてはDEVINFOでデバイス情報を戻り値で得る。
    DEVINFOの戻り値は、以下の値の論理和となる。

    各デバイスで実装されているとは限らないが、共通の命令は以下のとおりである。

    各デバイスに依存する命令としては以下のとおりである。

  13. int format(char *device)
    #include <mes.h>
  14. ディスクのフォーマット

    device:フォーマットしたいデバイス名称
    戻り値:成功時は0、失敗時は-1

  15. int delete(char *path)
    #include <mes.h>
  16. ファイルの削除

    path:削除したいファイル名を相対パスまたは絶対パスで指定する。
    戻り値:成功時は0、失敗時は-1

  17. int cd(char *path)
    #include <mes.h>
  18. 相対パス指定で利用するカレントフォルダを変更する

    path:カレントフォルダパス、例えば、RAMディスクへ移動するには"/ram0/"と指定する
    戻り値:成功時は0、失敗時は-1

  19. char* pwd(void)
    #include <mes.h>
  20. カレントフォルダの取得

    戻り値:カレントフォルダ名称の格納された文字列のポインタ、失敗時は0

  21. int getdirent(char *path, int index, char *name, int size)
    #include <mes.h>
  22. 対象となるファイルフォルダのファイル一覧の取得

    path:対象となるファイルフォルダ名を相対パスまたは絶対パスで指定する
    index:ファイル一覧のインデックス、インデックスは0番から始まる
    name:ファイル名称を格納するための文字列ポインタ
    size:ファイル名称を格納するための文字列の大きさ
    戻り値:対象となるファイルの大きさ、対象となるインデックスが存在しない場合は-1


メモリ管理のシステムコール群

取得したメモリ領域の先頭アドレスは4バイトバウンダリが必ず保証されている
  1. char* malloc(int size)
    #include <mes.h>
  2. メモリ領域の動的確保

    size:確保したいメモリ領域のサイズ
    戻り値:確保したメモリ領域のポインタ、失敗時は0

  3. int free(char *ptr)
    #include <mes.h>
  4. 確保したメモリ領域を開放

    ptr:mallocシステムコールで取得したメモリ領域のポインタ
    戻り値:成功時は0、失敗時は-1


プロセス管理のシステムコール群

  1. int execute(int argc, char** argv)
    #include <mes.h>
  2. プロセスを生成し、プログラムをマルチタスクで実行

    argc:実行ファイル名を含むパラメータの数
    argv:実行ファイル名を含むパラメータ文字列配列のポインタ
    戻り値:生成したプロセスのPID、失敗時は-1

  3. int exec_redirect(int argc, char** argv, int stdout, int stdin)
    #include <mes.h>
  4. 標準入出力を指定して、プロセスを生成し、プログラムをマルチタスクで実行

    argc:実行ファイル名を含むパラメータの数
    argv:実行ファイル名を含むパラメータ文字列配列のポインタ
    stdout:標準出力にしたいのファイル識別子
    stdin:標準入力にしたいのファイル識別子
    戻り値:生成したプロセスのPID、失敗時は-1

  5. int kill(int pid)
    #include <mes.h>
  6. プロセスを削除

    pid:削除対象となるプロセスID
    戻り値:成功時は0、失敗時は-1

  7. int wait(int pid)
    #include <mes.h>
  8. 対象となるプロセスが終了するまで待つ

    pid:対象となるプロセスID
    戻り値:成功時は0、失敗時は-1

  9. void exit()
    #include <mes.h>
  10. 自分のプロセスを終了させる
  11. int get_pid()
  12. 自分のプロセスIDを取得、失敗時は-1
  13. void sleep(int ms)
    #include <mes.h>
  14. ミリ秒単位の時間待ち
    ただし、非常に短い時間指定では、遅延する場合がある
  15. void set_timer(void (*func)(), int ms)
    #include <mes.h>
  16. func:タイマー割り込みが発生したときに呼び出す関数名
    ms:ミリ秒単位でタイマー割り込み時間を指定
    ただし、タスクが待ち状態の場合は、タイマー割り込みは保留される

共有メモリのシステムコール群

  1. int shmget(int key, int size)
    #include <mes.h>
  2. 共有メモリのキーに対応する共有メモリ識別子を取得する

    key:共有メモリのキー
    size:共有メモリの大きさ
    戻り値:共有メモリ識別子、失敗時は-1

  3. char *shmat(int id)
    #include <mes.h>
  4. 共有メモリ識別子に対応したメモリを確保する
    ただし、すでにメモリが確保されている場合は、共有メモリのアドレスのみを返す

    id:共有メモリ識別子
    戻り値:共有メモリのアドレス、失敗時は-1

  5. char *shmdt(int id)
    #include <mes.h>
  6. 共有メモリ識別子に対応したメモリを破棄する
    他のプロセスに関係なく実行されるので、全てのプロセスが絶対に対象となる共有メモリを使わないことを確認してから、このシステムコールを実行する必要がある

    id:共有メモリ識別子
    戻り値:成功時は0、失敗時は-1


ネットワーク関連のシステムコール群

ネットワークそのものを制御するシステムコール群とソケットAPI群から成る
IPアドレスは32ビット整数で指定をするが、IPアドレスの指定がわかりやすいようにIPADDRマクロが用意されている。
例えば、102.168.0.1と指定する場合は、IPADDR(192,168,0,1)と指定する
ソケットAPIでIPアドレスとポート番号を格納するsockaddr構造体は以下の構成となる
struct sockaddr {
unsigned int sin_addr;
unsigned short sin_port;
};
sin_addrはIPアドレス、sin_portはポート番号となる
  1. int if_dhcp(char* name)
    #include <mes.h>
  2. ネットワークデバイスを起動し、DHCPサーバからIPアドレスを取得し設定する

    name:対象となるネットワークデバイスのデバイス名称
    戻り値:ネットワークのインデックス、失敗時は-1

  3. int if_up(char* name)
    #include <mes.h>
  4. ネットワークデバイスのみを起動し、IPアドレスを設定しない

    name:対象となるネットワークデバイスのデバイス名称
    戻り値:ネットワークのインデックス、失敗時は-1

    暫定的にIPアドレスとネットマスクがゼロになるが、ネットワークの処理は行わない。
    そして、他のマシンより

    arp -s [IPアドレス] [MACアドレス]

    という操作のあと、他のマシンより上記IPアドレス宛てにアクセスがあると、そのIPアドレスが設定されて、ネットワーク処理が有効になる。
    この機能を使うと他のマシンより任意のIPアドレスの設定が可能となる。

  5. int ifconfig(char* name, unsigned int ip, unsigned int mask)
    #include <mes.h>
    IPアドレスとネットマスクを指定して、ネットワークデバイスを起動する

    name:対象となるネットワークデバイスのデバイス名称
    ip:IPアドレス
    mask:ネットマスク
    戻り値:ネットワークのインデックス、失敗時は-1

  6. int ifdown(char* name)
    #include <mes.h>
  7. 対象ネットワークデバイスを停止する

    name:対象となるネットワークデバイスのデバイス名称
    戻り値:成功時は0、失敗時は-1

  8. int getip(int index)
    #include <mes.h>
  9. 対象ネットワークのIPアドレスを取得する

    index:対象となるネットワークのインデックス
    戻り値:IPアドレス、失敗時は-1

  10. int getipinfo(int index, unsigned int *ip, unsigned int *mask, char* mac)
    #include <mes.h>
  11. 対象ネットワークの情報(IPアドレス、ネットマスク、MACアドレス)を取得する

    index:対象となるネットワークのインデックス
    ip:IPアドレスのポインタ
    mask:ネットマスクのポインタ
    mac:6バイトの文字列領域のポインタ、MACアドレスが格納される
    戻り値:成功時は0、失敗時は-1

  12. int get_mac_address(unsigned int req_ip, char* mac)
    #include <mes.h>
  13. IPアドレスに対応するMACアドレスを得る

    req_ip:対象となるネットワークデバイスのデバイス名称
    戻り値:成功時は0、失敗時は-1

  14. int ifgateway(int gwip)
    #include <mes.h>
  15. デフォルトゲートウェイの指定

    gwip:デフォルトゲートウェイのIPアドレス
    戻り値:成功時は0、失敗時は-1

  16. int cgi_value(char *opt, char *name, char *value, int size)
    #include <mes.h>
  17. CGIプログラムへ渡されるオプション文字列中の変数に対応する値を取得する

    opt:CGIプログラムへ渡される全体の文字列ポインタ
    name:取得したい値の変数名のポインタ
    value:対象となる変数の値を格納するための文字列ポインタ
    size:対象となる変数の値を格納するための文字列の大きさ
    戻り値:成功時は0、失敗時は-1

  18. int udp_socket()
    #include <mes.h>
  19. ダイアグラムソケットを取得する。
    なお、ソケットを取得したタスクが終了した場合、返却されていないソケットがあれば強制的にソケットを回収する。

    戻り値:ソケット識別子

  20. int udp_bind(int sock, struct sockaddr *addr)
    #include <mes.h>
  21. 対象となるソケットに対して、IPアドレスとポート番号を関連つける。

    sock:udp_socketで取得したソケット識別子
    addr:IPアドレスとポート番号をセットした構造体のポインタ
    戻り値:成功時は0、失敗時は-1

  22. int udp_free(int sock)
    #include <mes.h>
  23. ダイアグラムソケットを返却する。

    sock:udp_socketで取得したソケット識別子
    戻り値:成功時は0、失敗時は-1

  24. int recvfrom(int sock, char* data, int size, struct sockaddr *from)
    #include <mes.h>
  25. ダイアグラムデータを受信する

    sock:udp_socketで取得したソケット識別子
    data:読み込むデータのポインタ
    size:読み込むデータの大きさ
    from:送信元のIPアドレスとポート番号を格納するための構造体のポインタ
    戻り値:受信データ数、失敗時は-1

  26. int sendto(int sock, char* data, int size, struct sockaddr *target)
    #include <mes.h>
  27. ダイアグラムデータを送信する

    sock:udp_socketで取得したソケット識別子
    data:読み込むデータのポインタ
    size:読み込むデータの大きさ
    target:送信元のIPアドレスとポート番号をセットした構造体のポインタ
    戻り値:送信したデータ数、失敗時は-1

  28. int tcp_socket()
    #include <mes.h>
  29. ストリームソケットを取得する。
    なお、ソケットを取得したタスクが終了した場合、返却されていないソケットがあれば、接続を切断してから強制的にソケットを回収する。
    また、tcp_acceptで接続を受け付けたクライアントのソケットも同様となる。

    戻り値:ソケット識別子

  30. int tcp_free(int sock)
    #include <mes.h>
  31. ストリームソケットを返却する。

    sock:tcp_socketで取得したソケット識別子
    戻り値:成功時は0、失敗時は-1

  32. int tcp_bind(int sock, struct sockaddr *addr)
    #include <mes.h>
  33. 対象となるソケットに対して、IPアドレスとポート番号を関連つける。

    sock:tcp_socketで取得したソケット識別子
    addr:IPアドレスとポート番号をセットした構造体のポインタ
    戻り値:成功時は0、失敗時は-1

  34. int tcp_listen(int sock, struct sockaddr *addr)
    #include <mes.h>
  35. 対象となるソケットに対して、IPアドレスとポート番号を関連づけて、そのポート番号に対する接続受付の待ち行列を生成する。

    sock:tcp_socketで取得したソケット識別子
    addr:IPアドレスとポート番号をセットした構造体のポインタ
    戻り値:成功時は0、失敗時は-1

  36. int tcp_accept(int sock, struct sockaddr *client)
    #include <mes.h>
  37. tcp_listenで生成した接続受付の待ち行列によって、クライアントからの接続要求を受け付ける。

    sock:tcp_socketで取得したソケット識別子
    addr:接続したクライアントのIPアドレスとポート番号をセットした構造体のポインタ
    戻り値:成功時は接続したクライアントのソケット識別子、失敗時は-1

  38. int tcp_connect(int sock, struct sockaddr *client)
    #include <mes.h>
  39. TCPプロトコルのサーバに対してクライアントとして接続を行う。

    sock:tcp_socketで取得したソケット識別子
    addr:接続したサーバのIPアドレスとポート番号をセットした構造体のポインタ
    戻り値:成功時は0、失敗時は-1

  40. int tcp_recv(int sock, char* data, int size)
    #include <mes.h>
  41. ストリームデータを受信する。
    受信応答(ACK)は、すぐに返さずに次回のデータ送信で受信応答を返す。
    ただし、受信から1秒以上経ってデータ送信がない場合は、単独で受信応答を行う。

    sock:tcp_socketで取得したソケット識別子
    data:読み込むデータのポインタ
    size:読み込むデータの大きさ
    戻り値:受信データ数、ただし、相手から接続の切断要求があった場合は-1
    この場合は、相手のソケットをtcp_freeで返却する必要がある。

  42. int tcp_send(int sock, char* data, int size)
    #include <mes.h>
  43. ストリームデータを送信する。
    送信に対する応答が1秒以内にない場合は、再度、同じパケットを送信する。
    パケットの再送を7回行って応答がない場合は、接続を強制切断し、相手のソケットを自動的に回収をする。

    sock:tcp_socketで取得したソケット識別子
    data:読み込むデータのポインタ
    size:読み込むデータの大きさ

    戻り値:受信データ数、ただし、相手から接続の切断要求があった場合は-1
    この場合は、相手のソケットをtcp_freeで返却する必要がある。
  44. int tftp_load(int index, int ip, char *filename)
    #include <mes.h>
  45. TFTPサーバからファイルをRAMディスクにダウンロードする

    index:対象となるネットワークのインデックス
    ip:TFTPサーバのIPアドレス
    filename:ダウンロードするファイル名のポインタ
    戻り値:成功時は0、失敗時は-1