この章の目次にもどる
《UNIXエミュレータは、R4 で全面的に更新されている》
UNIX系のアプリケーションプログラム等
(プログラム開発ツール等)
を簡易に移植するためのプラットフォームとして、
UNIXエミュレータが用意されている。
また、UNIX系のファイル I/O関数(システムコール/ライブラリ)で、
MS-DOS のディスクやCD-ROMを統一的にアクセスする機能を持つ。
本来なら、BTRON
のシステムコールで統一的にアクセスできるようになるのが望ましいが、
BTRON のシステムコールは LINK(ファイルID) を基本にしており、
ファイル名を基本とする他の OS のファイルシステムとの適合性が低く難しい。
現時点では、UNIXエミュレータとして必要な全機能は実装されていない。
現時点で使用できるのは、セルフ開発環境として利用するのに必要な機能である。
MS-DOSのディスクは、フロッピーディスクまたはハードディスクの基本区画に対応
している。拡張区画には対応していない。また、読み出しのみで、書き込みはできない。
UNIX系のインクルードファイルは、(ベースディレトタリ)/include/unix に格納
されている。コンパイル時にこのパスをインクルードファイルの検索対象に
含めてある事を前提としている。使用可能なシステムコールは基本的にUNIXの仕様
と同じである。
UNIXのファイルには以下の種類がある。
- ディレクトリファイル
- シンボリックリンクファイル
- 一般ファイル
- デバイスファイル
このうち、デバイスファイルは未対応であるが、その他はBTRONにおける実身
に対応付けられる。
BTRONはディレクトリとファイルの区別はないが、UNIXファイルシステムをエミュレート
するために下記のルールが適用される。
- ディレクトリファイル
- リンクレコードを含む実身
- ファイルタイプが6の実身(キャビネットのピクトグラムを持つ実身)
- ディレクトリ自身を示す「.」と親ディレクトリを示す「..」
「.」「..」はBTRONのファイルシステムには存在しないため、
UNIXエミュレータの中で特別に対応する。
- シンボリックリンクファイル
ファイルタイプが22の実身でレコードタイプ16 に、リンク先のファイル名を
TRONコード文字列として記録する。
- 一般ファイル
上記以外の実身は一般ファイルと見なす。
ファイルの操作対象となるレコードは先頭のレコードタイプ31 のみである。
20文字を越えるファイル名を取り扱えるように、拡張ファイル名エンコード規約を定
め、UNIXエミュレータ環境においてのみ20文字を越えるファイル名を使用することが
できるようにしている。
UNIXエミュレータを経由するファイルアクセスにおいて, ファイル名が20文字を超え、
ファイル名の全ての文字がASCII文字(ただし0x20〜0x7e)である場合にのみ、
拡張ファイル名エンコードを適用する。
UNIXエミュレータを経由しない場合は, アプリケーション側で拡張ファイル名エンコード
に対応しない限り, 20文字を超えるUNIXファイルについて正しいファイル名を得ることはでき
ない。ただし、エンコード後の実身名はBTRONの実身名の規約に従っているので, 実身そ
のものを扱うことは可能である。
UNIXエミュレータ用のシェルである、ucliを通して取り扱う場合は正しいファイル名が
表示されるが、BTRONのアプリケーションで仮身を見ると文字化けする。
拡張ファイル名エンコード規約は以下の通りである。
- 実身名20文字を, 先頭部3文字とそれに続く17文字に分割する。
- 先頭3文字は固定文字列であり, エンコードの有無の識別に使用する。
TK_U(0x2355), TK_X(0x2358), 0xA121
0xA121はJIS X 0212(補助漢字)の1区1点に相当し、
JISでは未定義の文字であり、通常使用されることはない。
- それに続く17文字には, ファイル名が2文字ずつパックする。
ASCIIコード(0x20〜0x7e)を(0x80〜0xde)に変換し、2文字ずつパックする。
パック後は、TRONコードのDゾーン内の未定義文字とKSC5601(韓国)
に相当する文字になる。
- ファイル名の文字数が奇数の場合, 最後の1文字はパックされず、
通常のTRONコード(JISX 0208)にエンコードされる。
- 34文字を超えるファイル名は単に切捨てられる。
int attach( const TC *devnm, const char *connm, int mode )
int detach( const TC *devnm, int eject )
int mount(int type, const char *path, int flags, void *data)
int unmount(const char *path, int flags)
int creat(const char *path, mode_t mode)
int open( const char *path, int oflag, .../*int mode*/ )
int close( int fildes )
off_t lseek( int fildes, off_t offset, int whence )
ssize_t read( int fildes, void *buf, size_t nbyte )
ssize_t write( int fildes, const void *buf, size_t nbyte )
size_t readv(int fd, const struct iovec *iovp, int iovcnt)
int writev(int fd, const struct iovec *iovp, int iovcnt)
int unlink(const char *path)
int rename(const char *from, const char *to)
int truncate(const char *path, off_t length)
int ftruncate(int fd, off_t length)
int utimes(const char *path, const struct timeval *tptr)
long pathconf(const char *path, int name)
int stat(const char *path, struct stat *ub)
int fstat(int fd, struct stat *sb)
int lstat(const char *path, struct stat *ub)
int mkdir(const char *path, mode_t mode)
int rmdir(const char *path)
int getdents( int fildes, struct dirent *buf, size_t nbyte )
int getdirentries(int fd, char *buf, int count, long *basep)
int chroot(const char *path)
int chdir(const char *path)
int fchdir(int fd)
int sigaction(int signum, const struct sigaction *nsa, struct sigaction *osa)
int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
int fcntl(int fd, int cmd, ...)
int ioctl(int fd, unsigned long request, ...)
int symlink(const char *path, const char *link)
int readlink(const char *path, char *buf, int count)
int btron_prefork(void)
int btron_forkexecve(const char *fname, char * const *argv, char * const *envv)
pid_t wait( int *statusp)
int dup(int fd)
int dup2(int from, int to)
int pipe(int *fd)
pid_t getpid(void)
pid_t getppid(void)
int setitimer(int which, const struct itimerval *itv, struct itimerval *oitv)
int getitimer(int which, struct itimerval *itv)
int gettimeofday(struct timeval *tp, struct timezone *tzp)
int getrusage(int who, struct rusage *rusage)
int getdtablesize(void)
int getlink( const char *path, char *buf )
attach
,detach
,getlink
以外は、
基本的にUNIXの同名のシステムコールと同等の機能であるが、
全ての機能が実装されているわけではない。
- 上記以外にも、UNIXのシステムコールに対応するダミーの関数をいくつかを提供している。
ファイルを指すパス名は、以下の形式になる。
/接続名/ディレクトリ名/ファイル名.拡張子
(例) "/CD/DIR_1/FILE.EXT"
- 文字コードは、日本語 EUC
- 区切りコードの "/", " ." は、半角文字(ASCII)
#include <bsys/unixemu.h>
int attach( const TC *devnm, const char *connm, int mode )
デバイス名devnm
のデバイスを接続名connm
、
接続モードmode
で接続する。
接続名は、最大 16 バイト。
mode := (UX_BTRON‖UX_MSDOS‖UX_CDROM) | [UX_RONLY]
UX_RONLY | 0x0001 | 読み出しのみ |
UX_BTRON | 0x0000 | BTRON ファイルシステム |
UX_MSDOS | 0x0100 | MS-DOS ファイルシステム |
UX_CDROM | 0x0200 | CD-ROM ファイルシステム |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- 現時点では、ファイルシステムとして指定できるのは UX_CDROM と UX_MSDOSの2つのみである。ただし、どちらも読み出しのみで、書き込みはできない。
#include <bsys/unixemu.h>
int detach( const TC *devnm, int eject )
デバイス名 devnm
のデバイスを切断する。
- 引数
eject | 0 | メディアを排出しない |
| 1 | メディアを排出する |
| その他 | 未定義(指定不可) |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/mount.h>
int mount(int type, const char *path, int flags, void *data)
ファイルシステムをディレクトリに接続する。正常終了した場合、指定したディレクト
リへのアクセスはマウントしたファイルシステムのルートディレクトリへのアクセスに
なる。マウント中は指定ディレクトリの元の内容を参照する事は出来ない。
- 引数
int type | ファイルシステムのタイプ。 |
| MOUNT_MSDOS | MS-DOS |
| MOUNT_CD9660 | CD-ROM |
| MOUNT_BTRONFS | BTRON |
const char *path | マウントするディレクトリを指定する文字列。 |
int flags | 以下のビットの論理和。 |
| MNT_RDONLY | ファイルシステムを読み取り専用にマウントする。 |
| MNT_NOEXEC | ファイルシステムからの実行を禁止する。 |
| MNT_UNION | ファイルシステムをファイルシステムツリーの一部と見なす。 |
void *data | デバイス名の文字列へのポインタ。"fda"など。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- ファイルシステムの type と指定できる flags には制限がある。MS-DOS、CD-ROM ファイルシステムについては読み出し専用である。
#include <sys/mount.h>
int unmount(const char *path, int flags)
マウントしていたファイルシステムをマウント解除する。
- 引数
const char *path | マウント解除するファイルシステムがマウントしているディレクトリのパス。 |
int flags | MNT_FORCE: 強制解除 |
|
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <fcntl.h>
int creat(const char *path, mode_t mode)
通常ファイルの新規作成、またはpath
が指すパス名によって指定された既存ファイル
をオープンします。新規作成の場合は、プロセス・モード・マスクにより修正されたモ
ードmode
が与えられます。
- 引数
const char *path | 新規に作成するファイルのパス。 |
mode_t mode | ファイルモード。 |
- 戻り値
>=0 | ファイルディスクリプタ。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <fcntl.h>
int open( const char *path, int oflag, .../*int mode*/ )
パス名path
のファイル/ディレクトリをオープンモードoflag
でオープンする。
oflag
には、次のうち1つを指定する。
O_RDONLY | 0x0000 | 読み込みのみ |
O_WRONLY | 0x0001 | 書き込みのみ |
O_RDWR | 0x0002 | 読み込み書き込み |
oflag
には、オプションとして次のものを上記と OR で指定できる。
O_CREAT | 0x0200 | ファイルがなければファイル生成
ファイルがなければファイルを生成する。ファイルがすでにある場合にはこのフラグは何の効果もない。modeで指定されたモードでファイルを生成する |
O_TRUNC | 0x0400 | ファイル内容削除
ファイルの内容を破棄し、ファイルサイズを0にする。ディレクトリに対して指定した場合は無視される。 |
O_EXCL | 0x0800 | ファイルがあればエラー
O_CREAT と合わせて指定する。ファイルがすでにある場合は、エラーとする。 |
- 戻り値
>=0 | ファイルディスクリプタ。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int close( int fildes )
ファイルディスクリプタfildes
のファイル/ディレクトリをクローズする。
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
off_t lseek( int fildes, off_t offset, int whence )
ファイルディスクリプタfildes
のファイル / ディレクトリポインタ
( バイト単位の位置 ) を移動する。
whence | SEEK_SET (0) | offset の位置に移動 |
whence | SEEK_CUR (1) | 現在位置 + offset に移動 |
whence | SEEK_END (2) | 終端 + offset に移動 |
- 戻り値
>=0 | 正常終了。移動後の位置。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
ssize_t read( int fildes, void *buf, size_t nbyte )
ファイルディスクリプタfildes
のファイルの現在位置からnbyte
バイトをbuf
へ読み込む。読み込んだバイト数分、ファイルの現在位置を進める。
- 戻り値
>=0 | 読み込んだバイト数。0 はファイルの終端を示す。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
ssize_t write( int fildes, const void *buf, size_t nbyte )
ファイルディスクリプタfildes
のファイルの現在位置から
nbyte
バイトへbuf
を書き込む。
書き込んだバイト数分、ファイルの現在位置を進める。
- 戻り値
>=0 | 正常終了。書き込んだバイト数。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/uio.h>
size_t readv(int fd, const struct iovec *iovp, int iovcnt)
ファイルディスクリプタfd
が示すファイルからiovp
に記録されたiov
配列のメンバが指定したバッファへデータを読み込む。
- 引数
-
int fd | ファイルディスクリプタ |
const struct iovec *iovp iovec | 構造体配列へのポインタ。 |
int iovcnt | iovec 配列のインデックス数。 |
- 戻り値
>=0 | 実際に読み取ったバイト数。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/uio.h>
int writev(int fd, const struct iovec *iovp, int iovcnt)
ファイルディスクリプタfd
が示すファイルへiovp
に記録されたiov
配列のメンバが指定したバッファからデータを書き込む。
- 引数
-
int fd | ファイルディスクリプタ |
const struct iovec *iovp | iovec 構造体配列へのポインタ。 |
int iovcnt | iovec 配列のインデックス数。 |
- 戻り値
>=0 | 実際に書き込んだバイト数。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int unlink(const char *path)
パス名path
のファイルを削除する。
- 引数
-
const char *path | 削除するファイルを指定するパス。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <stdio.h>
int rename(const char *from, const char *to)
from
が指すパスをto
にリネームする。
- 引数
const char *from | リネームするパス。 |
const char *to | リネーム後のパス |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- 現状のインプリメントでは同一ディレクトリにおけるリネームのみに対応している。
#include <sys/types.h>
int truncate(const char *path, off_t length)
- 引数
const char *path | ファイルサイズを変更するファイルのパス。 |
off_t length | 変更するサイズ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
int ftruncate(int fd, off_t length)
- 引数
int fd | ファイルサイズを変更するファイルのファイルディスクリプタ。 |
off_t length | 変更するサイズ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/time.h>
int utimes(const char *path, const struct timeval *tptr)
path
で指定したファイルの変更時間を設定する。
- 引数
const char *path | 対象ファイルのパス。 |
const struct timeval *tptr | 変更する時間を格納した構造体へのポインタ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- 現状変更可能なのは変更時間のみ。アクセス時間は設定できない。
#include <unistd.h>
long pathconf(const char *path, int name)
- 引数
const char *path | ファイル/ディレクトリのパス。 |
int name | 制限値の種類 |
- 戻り値
0 | 取得した制限値。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *ub)
path
で指定したファイルに関する情報を取得する。
- 引数
const char *path | 対象ファイルを指定するパス。 |
struct stat *ub | stat構造体を指すポインタ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- UNIXファイルシステムと BTRON ファイルシステムの相違により、
stat
構造体に格納される情報はすべて有効なわけではない。
インプリメントの都合上ファイルのアクセス時間は意図しないタイミングで
更新されることがある。
__dev_t st_dev デバイスID
ino_t st_ino ファイルID
mode_t st_mode ファイルモード
nlink_t st_nlink ファイルの参照カウント
uid_t st_uid 常に0
gid_t st_gid 常に0
__dev_t st_rdev 常に0
struct timespec st_atimespec ファイルの最後のアクセス時間
struct timespec st_mtimespec ファイルの最後の変更時間
struct timespec st_ctimespec ファイルの生成時間
off_t st_size ファイル/レコードのサイズ
int64_t st_blocks ファイルに割り当てられているブロック数
u_int32_t st_blksize 論理ブロックのバイト数
u_int32_t st_flags 常に0
u_int32_t st_gen 常に0
int32_t st_lspare 未使用
int64_t st_qspare[2] 未使用
#include <sys/types.h>
#include <sys/stat.h>
int fstat(int fd, struct stat *sb)
引数のファイルディスクリプタが参照するオープンファイルのファイル情報を取得す
る。stat()
を参照。
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/stat.h>
int lstat(const char *path, struct stat *ub)
path
で指定したファイルに関する情報を取得する。
指定されたファイルがシンボリックリンクである事以外はstat()
と同じ。
シンボリックリンクの場合はリンクについての情報を返す。stat()
参照。
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *path, mode_t mode)
- 引数
const char *path | 作成するディレクトリのパス。 |
mode_t mode | 作成するディレクトリのモードマスク。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
mode
は無効。
#include <unistd.h>
int rmdir(const char *path)
path
で指定したディレクトリを削除する。
ディレクトリには "." ".." 以外のエントリがあってはならない。
また、ルートディレクトリ、呼び出しプロセスのカレントデ
ィレクトリであってはならない。
- 引数
const char *path | 削除するディレクトリ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/dirent.h>
int getdents( int fildes, struct dirent *buf, size_t nbyte )
struct dirent {
unsigned int d_fileno; /* ファイル番号 */
unsigned short d_reclen; /* レコード長 */
unsigned char d_type; /* ファイルタイプ */
unsigned char d_namlen; /* d_name の文字列長 */
char d_name[255+1]; /* 名前 */
};
/* ファイルタイプ */
#define DT_UNKNOWN 0 /* 不明 */
#define DT_DIR 4 /* ディレクトリ */
#define DT_REG 8 /* 普通のファイル */
ファイルディスクリプタ fildes のディレクトリの現在位置からディレクトリエントリ
ー(レコード)を一つ読み込み、 struct dirent の形式に変換して buf へ書き込む。デ
ィレクトリの現在位置が次のディレクトリエントリーに移動する。 struct dirent は
可変長データで、そのサイズを nbyte に指定する。 読み込まれたディレクトリエン
トリーが nbyte に収まらない場合はエラー ( EINVAL ) となる。
- 引数
int filedes | 取得するディレクトリを示すファイルディスクリプタ。 |
struct dirent *buf | ディレクトリエントリを格納するバッファのアドレス。 |
size_t nbyte | バッファのサイズ。 |
- 戻り値
>=0 | 転送したバイト数。0 は、ディレクトリの終端を示す。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- 通常 getdents()は複数エントリを返す仕様だが、
現在のインプリメントは単一のエントリを返すので注意。
#include <dirent.h>
int getdirentries(int fd, char *buf, int count, long *basep)
fd
で指定したディレクトリからディレクトリエントリを
struct dirent
の並びとしてbuf
に書き込む。
- 引数
int fd | 取得するディレクトリを示すファイルディスクリプタ。 |
char *buf | ディレクトリエントリを格納するバッファのアドレス。 |
int count | バッファのサイズ。 |
long *basep | 読み取ったブロックの位置。 |
- 戻り値
>=0 | 転送したバイト数。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int chroot(const char *path)
'/'で始まるパス名を検索する始点を変更する。
プロセスのカレントディレクトリに影響は与えない。
- 引数
const char *path | 変更後のルートディレクトリのパスを表す NULL 終端の文字列。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int chdir(const char *path)
パス名path
のディレクトリにカレントディレクトリを移動する。
- 引数
const char *path | 移動先のディレクトリを指定するパス。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int fchdir(int fd)
ファイルディスクリプタfd
のディレクトリにカレントディレクトリを移動する。
- 引数
int fd | 移動先のディレクトリを指定するファイルディスクリプタ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <signal.h>
int sigaction(int signum, const struct sigaction *nsa, struct sigaction *osa)
特定のシグナルに対応する動作の検査、および指定を行う。
- 引数
int signum | シグナル番号 |
const struct sigaction *nsa | NULLでない場合、指定するシグナルに対応する動作を指定する構造体へのポインタ |
struct sigaction *osa | NULLでない場合、指定するシグナルに対応する以前の動作を格納する構造体へのポインタ |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
呼び出したプロセスのシグナルマスクを検査、設定する。
set
の値が NULL
でない場合、
how
の値によってプロセスのシグナルマスクを操作する。
- 引数
int how | SIG_BLOCK: setにより指定したシグナル集合をプロセスのシグナルマスクに or する。 |
| SIG_UNBLOCK: setにより指定したシグナル集合用いてプロセスのシグナルマスクをクリアする。 |
| SIG_SETMASK: setにより指定したシグナル集合用いてプロセスのシグナルマスクを書き換える。 |
const sigset_t *set | NULL でない場合、シグナル集合を意味する。 |
sigset_t *oset | NULL でない場合、元のシグナルマスク値をコピーする。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ...)
オープン記述子上でさまざまな機能を実行する。詳細はUNIXシステムコールを参照
のこと。ただしすべての機能に対応しているわけではない。
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...)
ファイルディスクリプタfd
が参照するオブジェクトに対して特殊操作を行う。
その内容はオブジェクトの種類による。
- 引数
int fd | ファイルディスクリプタ。 |
unsigned long request | 操作種類。fd が指すオブジェクトによる。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- 現状対応しているのはコンソールに対する操作のみである。
TIOCGETA: 端末の状態をtermios
構造体に格納し取得する。
TIOCSETA: 渡したtermios
構造体に基づき端末の状態を設定する。
#include <unistd.h>
int symlink(const char *path, const char *link)
path
で指定したファイルに対してlink
のシンボリックリンクを作成する。
- 引数
const char *path | シンボリックリンクにより参照されるファイル/ディレクトリのパス。 |
const char *link | シンボリックリンクのパス名。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int readlink(const char *path, char *buf, int count)
で指定したシンボリックリンクの値をbuf
に格納する。
- 引数
const char *path | シンボリックリンクのパス。 |
char *buf | シンボリックリンクの値を格納するバッファのポインタ。値の末尾はNULLが付加されない。 |
int count | buf のサイズ。 |
- 戻り値
>=0 | バッファに格納された文字列のバイト数。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <bsys/unixemu.h>
int btron_prefork(void)
自プロセスの環境を複製し、子プロセス起動の用意をします。
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <bsys/unixemu.h>
int btron_forkexecve(const char *fname, char * const *argv, char * const *envv)
fname
で指定したプログラムを起動する。
- 引数
const char *fname | 起動するプログラムファイルのパス。 |
char * const *argv | 新プロセスに渡す引数リスト。NULL終端の文字列を指すポインタからなるNULLで終端する配列のポインタ。 |
char * const *envv | 新プロセスに渡す環境変数リスト。NULL終端の文字列を 指すポインタからなるNULLで終端する配列のポインタ。 |
- 戻り値
>=0 | 起動した子プロセスのプロセスID。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/wait.h>
pid_t wait( int *statusp)
シグナルを受信するか、その子プロセスが終了するまで呼び出したプロセスをブロック
する。既にいずれかの子プロセスが終了しており、そのことがまだwait()
を使用して通知されていない場合はそのような子プロセスのうちの一つのプロセスIDと
終了ステータスを格納してすぐに返る。子プロセスがない場合はすぐに返る。
正常終了した場合で statusp
が NULLでない場合は wait()
の戻り値で表される子プロセスの終了ステータスがstatusp
で示される場所に格納される。
- 引数
int *statusp | 子プロセスの終了ステータスを記録するメモリへのポインタ |
- 戻り値
>0 | 子プロセスID。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int dup(int fd)
fd
したファイルディスクリプタを複製し、戻り値として返す。
返されるファイルディスクリプタは、現在プロセスで使用されていない
ファイルディスクリプタのうち最下位の番号である。
- 引数
- 戻り値
>=0 | 正常終了。複製されたファイルディスクリプタ。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int dup2(int from, int to)
ファイルディスクリプタ from を to に複製する。to が既に使用されている場合は cl
ose() でクローズしたかのようにその割り当てを解除した後複製される。
- 引数
int from | 複製するファイルディスクリプタ。 |
int to | 複製後のファイルディスクリプタ。 |
- 戻り値
>=0 | 複製後のファイルディスクリプタ。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
int pipe(int *fd)
パイプを生成し、fd[0]、fd[1]
に二つのファイルディスクリプタを格納する。
fd[0]
は読み取り用にオープンされ、fd[1]
は書き込み用にオープンされる。
- 引数
- 戻り値
>=0 | 複製後のファイルディスクリプタ。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <unistd.h>
pid_t getpid(void)
カレントプロセスのプロセスIDを取得する。
- 戻り値
#include <unistd.h>
pid_t getppid(void)
カレントプロセスの親プロセスIDを取得する。
- 戻り値
#include <sys/time.h>
int setitimer(int which, const struct itimerval *itv, struct itimerval *oitv)
- 引数
int which | 設定するインターバルタイマー型。 |
const struct itimerval *itv | NULLでない場合、インターバルタイマーを設定する構造体へのポインタ。 |
struct itimerval *oitv | NULLでない場合、これまでのインターバルタイマーの設定を格納するアドレス。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/time.h>
int getitimer(int which, struct itimerval *itv)
- 引数
int which | 取得するインターバルタイマー型。 |
struct itimerval *itv | NULLでない場合、これまでのインターバルタイマーの設定を格納するアドレス |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <time.h>
int gettimeofday(struct timeval *tp, struct timezone *tzp)
現在のグリニッジ時間を1970年1月1日0000から経過した秒とマイクロ秒単位で求める。
- 引数
struct timeval *tp | データを保存する timeval 構造体へのポインタ。NULLの場合は無視される。 |
struct timezone *tzp | タイムゾーンは廃止された。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/resource.h>
int getrusage(int who, struct rusage *rusage)
カレントプロセスによって利用された資源に関する情報を取得する。
- 引数
int who | RUSAGE_SELF カレントプロセス。 |
struct rusage *rusage | 情報を格納する構造体へのポインタ。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
- 備考:
- who は RUSAGE_SELF のみ、struct rusage は ru_utime, ru_stime のみ対応。他は0を返す。
#include <unistd.h>
int getdtablesize(void)
- 戻り値
#include <bsys/unixemu.h>
int getlink( const char *path, char *buf )
UNIXエミュレータ上のアプリケーションから BTRON の実身を扱うためのインターフェース。パス
名から対応する実身の LINK を取得する。
- 引数
const char *path | LINK に変換するファイル/ディレクトリのパス |
char *buf | LINK を格納するメモリ。sizeof( LINK)以上の領域が必要。 |
- 戻り値
0 | 正常終了。 |
-1 | エラー。
errno にエラーコードを設定する。 |
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode)
ダミー。常にエラー終了する。
#include <sys/resource.h>
int getrlimit(int which, struct rlimit *rlp)
ダミー。正常終了する。
#include <unistd.h>
int setgid(gid_t gid)
ダミー。常にエラー終了する。
#include <unistd.h>
int issetugid(void)
ダミー。常に0を返す。
#include <unistd.h>
int mknod(const char *path, mode_t mode, dev_t dev)
ダミー。常にエラー終了する。
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path, mode_t mode)
int fchmod(int fd, mode_t mode)
ダミー。正常終了する。
#include <unistd.h>
int chown(const char *path, uid_t uid, gid_t gid)
int fchown(int fd, uid_t uid, gid_t gid)
int lchown(const char *path, uid_t uid, gid_t gid)
ダミー。正常終了する。
#include <unistd.h>
int setuid(uid_t uid)
ダミー。常に正常終了する。
#include <unistd.h>
uid_t getuid(void)
ダミー。常に0を返す。
#include <unistd.h>
uid_t geteuid(void)
ダミー。常に0を返す。
#include <sys/stat.h>
int chflags(const char *path, unsigned long flags)
int fchflags(int fd, unsigned long flags)
ダミー。正常終了する。
#include <signal.h>
int kill(pid_t pid, int signum)
ダミー。正常終了する。
#include <unistd.h>
char *sbrk(int incr)
ダミー。常にエラー終了する。
#include <sys/types.h>
#include <sys/mman.h>
caddr_t mmap(caddr_t *addr, size_t len, int prot, int flags, int fd, off_t pos)
ダミー。常にエラー終了する。
#include <sys/types.h>
#include <sys/mman.h>
int munmap(caddr_t *addr, size_t len)
ダミー。常にエラー終了する。
#include <unistd.h>
int getgroups(int gidsetsize, gid_t *gidset)
ダミー。正常終了する。
#include <unistd.h>
pid_t getpgrp(void)
ダミー。常にエラー終了する。
#include <unistd.h>
gid_t getegid(void)
ダミー。常に0を返す。
#include <unistd.h>
gid_t getgid(void)
ダミー。常に0を返す。
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t newmask)
ダミー。正常終了する。
#include <unistd.h>
int fsync(int fd)
ダミー。正常終了する。
#include <signal.h>
int sigsuspend(const sigset_t *mask)
ダミー。正常終了する。
#include <sys/time.h>
int settimeofday(const struct timeval *tv, const struct timezone *tzp)
ダミー。正常終了する。
#include <unistd.h>
int link(const char *path, const char *link)
ダミー。エラー終了する。
errno
に設定されるエラーコードは以下の通り。
#include <errno.h>
ENOENT | ファイル/ディレクトリが存在しない |
EBADF | ファイルディスクリプタが間違っている |
EINVAL | パラメータが不正である |
EIO | I/O エラーが起きた |
ENOMEM | メモリ不足 |
EPERM | 操作が許可されていない |
EINTR | システムコール中に割り込みが発生した |
ENOEXEC | 実行形式エラー |
ECHILD | 子プロセス不在エラー |
EACCES | パーミッションエラー |
EFAULT | 不正アドレス |
EBUSY | デバイスが使用中 |
EEXIST | ファイルが既に存在している |
EXDEV | デバイス間のリンク |
ENODEV | そのデバイスではその操作がサポートされていない |
ENOTDIR | ディレクトリでない |
EISDIR | ディレクトリである |
ENOTTY | そのデバイスには不適切なioctl |
ENOSPC | デバイスフル |
EROFS | 読み取り専用のファイルシステム |
この章の目次にもどる