サービスコール リファレンス マニュアル

目次

概要

戻り値
ファイル I/O
ファイル管理
ディレクトリ管理
デバイス管理
プロセス管理
メモリー管理
パイプ管理
タスクローカルストレージ管理
その他補助ツール
索引

概要

サブシステムで提供される機能を利用するには sc_〜 で定義される C 言語の関数を呼び出します(サービスコール)。
必要なファイルは sc.h (mpltype.h, cputype.h) と sc.a (kc.a) です。
以降でサービスコールに必要な型及び、個々の関数を説明します。

MPL で定義される型を以下に記述します。

型名:内容
byte:8bit 符号無し整数
word16:16bit 符号無し整数
word32:32bit 符号無し整数
word: 処理系依存の符号無し整数
以下の条件を満たす
  • 全ての型のポインターと相互変換及び演算ができる
  • 可能な限り大きな数を扱える
  • 可能な限り CPU が無理なく操作できる
numeric: 処理系依存の符号付き整数
以下の条件を満たす
  • 全ての型のポインターの演算に使用できる
  • 可能な限り大きな数を扱える
  • 可能な限り CPU が無理なく操作できる
tas_flg:kc_tas_try で利用するフラグ
RESULT:カーネルコールの結果
HANDLE:カーネル資源のハンドル
HJOB:ジョブハンドル
HTSK:タスクハンドル
HMTX:ミューテックスハンドル
HCND:条件変数ハンドル
HRPC:RPC ハンドル

サービスコール用に追加される型を以下に記述します。

型名:内容
HFILE:ファイルハンドル
HDIR:ディレクトリハンドル

戻り値

標準的なカーネルコールの戻り値 (RESULT 型) を以下に記述します。

定数::意味
RC_SUCCESS:0:正常終了
RC_FAIL:1:異常終了
RC_INVALIDATE_ARG:2:不正な引数
RC_INVALIDATE_HANDLE:3:不正なハンドル
RC_RIGHTLESS:4:権利の無い引数・操作
RC_JOB_ABORTED:5:job が戻り値を持たない
RC_JOB_INVALIDATE_PTR:6:wait 中にポインターが無効になった
RC_MTX_BROKEN:7:壊れたミューテックス
RC_RPC_BROKEN:8:reply した rpc は破棄
RC_FATAL:-1:システムエラー
RC_RESOURCE_POOR:-2:システムリソース不足
RC_LIMIT_OVER:-3:システム制限値オーバー
RC_RESERVED:-4:使用中

関数

ファイル I/O

sc_io で始まるサービスコールはファイル I/O 機能を提供します。
I/O 操作するファイルは HFILE 型のハンドルで識別し、入出力命令を実行します。

HFILE* sc_io_open(const char *path, word32 mode)

引数
const char*path:操作対象にしたいファイルのパス
word32mode:オプションフラグ
戻り値
NULL 以外:成功
NULL:失敗
説明

ファイルを操作するためのハンドルを取得します。
オプションフラグは以下のいずれかを選択します。

定数意味
OPEN_READ0読み込み
OPEN_WRITE1書き込み
OPEN_UPDATE2更新
OPEN_APPEND3追加

ファイルが存在しない場合、 OPEN_READ なら処理失敗で終了し、それ以外の場合は sc_file_create でファイルを作成します。

HFILE* sc_io_dup(HFILE *file, HJOB job)

引数
HFILE*file:複製元のファイルハンドル
HJOBjob:複製したファイルハンドルのオーナー
戻り値
NULL 以外:成功
NULL:失敗
説明

ファイルハンドルを複製します。

RESULT sc_io_close(HFILE *file)

引数
HFILE*file:操作を終了したいファイルのハンドル
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルハンドルを解放します。

RESULT sc_io_read(HFILE *file, char *buf, word size, word *rc_size)

引数
HFILE*file:操作したいファイルのハンドル
char*buf:読み込みバッファ
wordsize:読み込み要求サイズ
word*rc_size:実際に読み込んだサイズ
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルからデータを読み込みます。

RESULT sc_io_write(HFILE *file, const char *buf, word size, word *rc_size)

引数
HFILE*file:操作したいファイルのハンドル
char*buf:書き出しバッファ
wordsize:書き出し要求サイズ
word*rc_size:実際に書き出したサイズ
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルにデータを書き出します。

RESULT sc_io_getpos(HFILE *file, word *pos)

引数
HFILE*file:操作したいファイルのハンドル
word*pos:位置を取得する領域
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルのデータ操作位置を取得します。

RESULT sc_io_setpos(HFILE *file, word type, word offset)

引数
HFILE*file:操作したいファイルのハンドル
wordtype:操作内容
wordoffset:移動量
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルのデータ操作位置を設定します。

動作内容は以下の通りです。

定数動作
SETPOS_HEAD0先頭からの順方向移動《※絶対位置指定》
SETPOS_NEXT1現在位置からの順方向移動
SETPOS_BACK2現在位置からの逆方向移動
SETPOS_TAIL3末尾からの逆方向移動

RESULT sc_io_ctrl(HFILE *file, word32 code, IOBUF *bufs, word cnt)

引数
HFILE*file:操作したいファイルのハンドル
word32code:機能コード
IOBUF*bufs:パラメータリスト
wordcnt:パラメータ数
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルに制御コマンドを送ります。
制御コマンドは以下の構造体の配列です。
具体的な内容は個々のデバイスによって異なります。

typedef struct {
    void       *buff ;
    const void *cbuff ;
    word        size ;
    word32      io_flg ;
} IOBUF ;
	
void*buff:データを指すポインタ
const void*cbuff:データを指すポインタ(コンスト用:こちらがNULL以外だとbuffの内容は無視する)
wordsize:バッファのサイズ(bytes)
word32io_flg:バッファの属性
IOBUF_IN…結果を受け取るバッファ
IOBUF_OUT…パラメータを渡すバッファ
IOBUF_IN|IOBUF_OUT…共有バッファ

ファイル管理

sc_file で始まるサービスコールはファイル管理機能を提供します。

RESULT sc_file_create(const char *path)

引数
const char*path:作成するファイルのパス
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルを作成します。
既に同名のファイル/ディレクトリが存在する場合は失敗します。

RESULT sc_file_delete(const char *path)

引数
const char*path:削除するファイルのパス
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルを削除します。
ファイル・マウントしたファイルシステム・登録したデバイスドライバーを削除できます。

RESULT sc_file_move(const char *src, const char *dest)

引数
const char*src:移動元のファイルパス
const char*dest:移動先のファイルパス
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルを移動します。
移動可能なのは同一ファイルシステム内部のみで、ファイルシステムを跨いだ移動はできません。

RESULT sc_file_getattr(const char *path, FATTR *attr)

引数
const char*path:ファイルのパス
FATTR*attr:属性を受け取る領域
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルの属性を取得します。
内容は以下の通りです。
現在は多くの項目が "ダミー" として項目のみ存在し、実際には機能していません。

typedef struct {
    word   size ;
    word   atime ;
    word   mtime ;
    word   ctime ;
    word32 type ;
    word32 uid ;
    word32 gid ;
    word32 permission ;
    word32 set_flg ;
} FATTR ;
	
wordsize:ファイルサイズ (byte)
wordatime:最終アクセス日時 ※ダミー
wordmtime:最終更新日時
wordctime:ファイル作成日時 ※ダミー
word32type:ファイルの種類
word32uid:所有ユーザーID ※ダミー
word32gid:所有グループID ※ダミー
word32permission:アクセス権利 ※ダミー
word32set_flg:sc_file_getattr() では未使用

ファイルの種類は下位 4bit のみ意味を持ち、以下の値を or した値です。

定数動作
FTYPE_IO0x00000001I/O CTRL
FTYPE_FILE0x00000002ファイル
FTYPE_DIR0x00000004ディレクトリ
FTYPE_EXT0x00000008拡張

permission は 下位 12bit を 4bit 毎に分けて所有者・所有グループ・その他に対応する権利を表します。
以下、bit が 1 なら対応する権利を保持しています。

bit対象動作
0x00000400所有者読み込み
0x00000200所有者書き出し
0x00000100所有者実行/検索
0x00000040グループ読み込み
0x00000020グループ書き出し
0x00000010グループ実行/検索
0x00000004その他読み込み
0x00000002その他書き出し
0x00000001その他実行/検索

atime, mtime, ctime は UTC 1970/1/1 0:0:0 からの経過秒数です。

RESULT sc_file_setattr(const char *path, FATTR attr)

引数
const char*path:ファイルのパス
FATTRattr:属性
戻り値
RC_SUCCESS:成功
:失敗
説明

ファイルの属性を設定します。
内容は基本的にsc_file_getattrと同じですが、設定したい項目を set_flag で指定する点が異なります。
set_flg は以下の値から変更したい物全てを or した値です。

定数動作
SETATTR_UID0x00000002uid ※ダミー
SETATTR_GID0x00000004gid ※ダミー
SETATTR_PERMISSION0x00000008permission ※ダミー
SETATTR_ATIME0x00000010atime ※ダミー
SETATTR_MTIME0x00000020mtime
SETATTR_CTIME0x00000040ctime
SETATTR_ALLUSER0x0000000e全てのアクセス権
SETATTR_ALLTIME0x00000070全ての時刻
SETATTR_ALL0x0000007e全ての属性

type, size は設定できません。
現在は多くの項目が "ダミー" として項目のみ存在し、実際には機能していません。

ディレクトリ管理

sc_dir で始まるサービスコールはディレクトリ管理機能を提供します。

RESULT sc_dir_create(const char *path)

引数
const char*path:作成するディレクトリのパス
戻り値
RC_SUCCESS:成功
:失敗
説明

ディレクトリを作成します。
既に同名のファイル/ディレクトリが存在する場合は失敗します。

RESULT sc_dir_delete(const char *path)

引数
const char*path:削除するディレクトリのパス
戻り値
RC_SUCCESS:成功
:失敗
説明

ディレクトリを削除します。

HDIR* sc_dir_open(const char *path)

引数
const char*path:読み込みたいディレクトリのパス
戻り値
NULL 以外:成功
NULL:失敗
説明

ディレクトリを読み込むためのハンドルを取得します。

RESULT sc_dir_close(HDIR *dir)

引数
HDIR*dir:操作を終了したいディレクトリハンドル
戻り値
RC_SUCCESS:成功
:失敗
説明

ディレクトリハンドルを解放します。

RESULT sc_dir_read(HDIR *dir, char *name, word size, FATTR *attr)

引数
HDIR*dir:操作を終了したいディレクトリハンドル
char*name:ファイル名を受け取る領域
wordsize:ファイル名を受け取る領域のサイズ
FATTR*attr:ファイル属性を受け取る領域(NULL で省略可能)
戻り値
RC_SUCCESS:成功
:失敗
説明

ディレクトリの内容を1つ読み込みます。

デバイス管理

sc_device で始まるサービスコールはデバイス管理機能を提供します。

RESULT sc_device_mount(const char *path, const char *drive, word32 type)

引数
const char*path:マウント先のファイルパス
const char*drive:ドライブのファイルパス
word32type:ファイルシステムの種類
戻り値
RC_SUCCESS:成功
:失敗
説明

ディスクドライブをファイルシステムとしてマウントします。

type は 1 … Human68k ファイルシステム(TwentyOne 拡張)のみ指定可能です。

RESULT sc_device_regist(const char *path, HTSK tsk, HANDLE id)

引数
const char*path:登録先のファイルパス
HTSKtsk:ドライバタスク
HANDLEid:識別ID
戻り値
RC_SUCCESS:成功
:失敗
説明

ドライバタスクをファイル/ファイルシステムとして登録します。

プロセス管理

sc_process で始まるサービスコールはプロセス管理機能を提供します。

HJOB sc_process_exec(const char *path, char *argv[], char *envp[], word level, word stack, HFILE *stdio[])

引数
const char*path:実行ファイルのパス
char*[]argv:引数
char*[]envp:環境変数
wordlevel:実行優先度
wordstack:スタックサイズ(pages)
HFILE*[]stdio:標準入出力
戻り値
0 以外:成功
0:失敗
説明

実行ファイルからプロセスを作成します。

argv[]とenvp[]は引数及び環境変数文字列を指すポインタの配列です。
配列の最後のポインタはNULLを格納し配列の終了を宣言してください。

実行優先度とスタックサイズはプロセスのメインタスクに対する条件設定です。
詳細はカーネルコールの同項目を参照してください。

標準入出力はプロセスが開始時に開く入出力及びデバイスを指定します。
この項目はNULLで省略可能です。
省略しない場合はHFILE*[5]を渡してください、内訳は以下の通りで内要を0クリアした要素は個別に指定を省略できます。
[0].標準入力
[1].標準出力
[2].標準エラー出力
[3].キーボード
[4].コンソール
省略した項目は通常sc_process_execを実行したプロセスから継承します。
またここで指定したファイルハンドルは実行したプロセスに渡されるため使用不可能になります。
この関数がエラー終了した場合はハンドルは依然残っているので自身で削除してください。

RESULT sc_process_exit(HJOB job, int code)

引数
HJOBjob:終了させるプロセスのハンドル(0 なら自プロセス)
intcode:終了コード
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスを終了します。
終了可能なプロセスは自分か自分の子プロセスのみです。

RESULT sc_process_wait(HJOB job, int *code)

引数
HJOBjob:終了を待つプロセスのハンドル
int*code:終了コードを受け取る領域(NULLで省略可能)
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスの終了を待ち、終了コードを取得します。

RESULT sc_process_ignore(HJOB job)

引数
HJOBjob:終了待ち及び戻り値を放棄するプロセスのハンドル
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスの終了時に自動削除するように指示します。
プロセスの終了を待ったり戻り値を取得する事はできなくなります。

RESULT sc_process_getcd(char *path, word size, word *rc_size)

引数
char*path:カレントディレクトリを受け取るバッファ
wordsize:バッファのサイズ
word*rc_size:パス文字列長さを受け取る領域(NULL で省略可能)
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスのカレントディレクトリを取得します。
バッファの最後には必ず\0が追加されます。
バッファサイズが足りない場合は途中までを取得し、最後に\0を加えます。
rc_size は正しいパス文字列の長さで、バッファに格納されたパス文字列の長さではないので注意してください。

RESULT sc_process_setcd(const char *path)

引数
const char*path:移動したいパス
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスのカレントディレクトリを移動します。

RESULT sc_process_getstdio(HFILE *file[])

引数
HFILE*[]read:標準入出力ハンドルを受け取る領域
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスの標準入出力を取得します。
取得したハンドルはプロセスの所持するハンドルの複製なので不要になったら閉じてください。

RESULT sc_process_setstdio(HFILE *file[])

引数
HFILE*[]read:標準入出力ハンドルを受け取る領域
戻り値
RC_SUCCESS:成功
:失敗
説明

プロセスの標準入出力を設定します。
設定したハンドルはプロセス側に管理が移動するので以後アクセスしないでください。
配列の内容は以下の通りです。

メモリー管理

メモリーブロックの動的確保について説明します。
kc_ram_alloc等でも同様の処理ができますが、プロセスと結びつけて管理するために通常はこちらを利用してください。

void* sc_malloc(word size)

引数
wordsize:確保したいメモリーブロックのサイズ
戻り値
NULL以外:成功
NULL:失敗
説明

メモリーブロックを確保します。
サイズはbyteで指定します。

void sc_free(void *mem)

引数
void*mem:解放したいメモリーブロック
戻り値
有りません
説明

メモリーブロックを解放します。

パイプ管理

パイプ処理に付いて説明します。
パイプは2つのプロセスの標準入出力をつなげるためのFIFO機能です。

RESULT sc_pipe_create(HFILE *file[], word size)

引数
HFILE*[]file:ハンドルを受け取る領域
wordsize:バッファサイズ
戻り値
RC_SUCCESS:成功
:失敗
説明

パイプを作成します。
パイプはバイナリーデータを転送するための一方向キューです。
書き込み用ハンドルに対して出力したデータを読み出し用ハンドルから入力する事ができます。
パイプが保持しているバッファが不足しない限り読み出し・書き込み共に非同期で処理できます。
サイズに 0 を指定した場合はデフォルト値(4096 byte)で代用されます。
ハンドルの内容は以下の通りです。

タスクローカルストレージ管理

タスクローカルストレージに付いて説明します。
タスクローカルストレージは個々のタスク毎に保持できるデータ領域です。
データを示す名前文字列と内容(word値)のペアとして管理します。

RESULT sc_tls_get(const char *name, word *data)

引数
const char*name:識別名
word*data:データを受け取る領域
戻り値
RC_SUCCESS:成功
:失敗
説明

タスクローカルデータを取得します。

RESULT sc_tls_set(const char *name, word data)

引数
const char*name:識別名
worddata:設定するデータ
戻り値
RC_SUCCESS:成功
:失敗
説明

タスクローカルデータを登録・変更します。
現在TLSを持ったタスクが終了しても即座にTLSが解放されず、タスクの所属するプロセスが終了するまで解放が延期される問題が有ります。

その他補助ツール

その他、雑多なツールを以下に説明します。

RESULT sc_path_split(const char *path, char *dir, char *file)

引数
const char*path:パス文字列
char*dir:ディレクトリ文字列を受け取る領域(NULL で省略可能)
char*file:ファイル名を受け取る領域(NULL で省略可能)
戻り値
RC_SUCCESS:成功
:失敗
説明

パス文字列をディレクトリとファイル名に分割します。
dir, file は各々 char dir[MAX_PATHLEN], char file[MAX_NAMELEN] のサイズを用意してください。
ディレクトリ文字列はルートディレクトリの場合以外は最後の区切り文字 '/' が省略されます。

RESULT sc_path_join(char *path, const char *dir, const char *file)

引数
char*path:パス文字列を受け取る領域
const char*dir:ディレクトリ文字列
const char*file:ファイル名
戻り値
RC_SUCCESS:成功
:失敗
説明

ディレクトリ文字列とファイル名からパス文字列を合成します。
path には char path[MAX_PATHLEN] のサイズを用意してください。
ディレクトリ文字列最後の区切り文字 '/' は有っても無くてもかまいません。

void sc_puts(const char *s)

引数
const char*s:表示文字列
戻り値
有りません
説明

文字列をコンソールに表示します。

void sc_putu(word32 n)

引数
word32n:表示数値
戻り値
有りません
説明

数値をコンソールに表示します。

void sc_putn(int n)

引数
intn:表示数値
戻り値
有りません
説明

数値をコンソールに表示します。

void sc_puth(word32 n)

引数
word32n:表示数値
戻り値
有りません
説明

数値をコンソールに16進数で表示します。

索引

ファイル I/O
sc_io_open
sc_io_dup
sc_io_close
sc_io_read
sc_io_write
sc_io_getpos
sc_io_setpos
sc_io_ctrl

ファイル
sc_file_create
sc_file_delete
sc_file_move
sc_file_getattr
sc_file_setattr

ディレクトリ
sc_dir_create
sc_dir_delete
sc_dir_open
sc_dir_close
sc_dir_read
デバイス
sc_device_mount
sc_device_regist

プロセス
sc_process_exec
sc_process_exit
sc_process_wait
sc_process_ignore
sc_process_getcd
sc_process_setcd
sc_process_getstdio
sc_process_setstdio

メモリー
sc_malloc
sc_free
パイプ
sc_pipe_create

タスクローカルストレージ
sc_tls_get
sc_tls_set

その他補助ツール
sc_path_split
sc_path_join
sc_puts
sc_putu
sc_putn
sc_puth
inserted by FC2 system