この章の目次にもどる

第1章 UNIXエミュレータ

《UNIXエミュレータは、R4 で全面的に更新されている》

1.1 概要

UNIX系のアプリケーションプログラム等 (プログラム開発ツール等) を簡易に移植するためのプラットフォームとして、 UNIXエミュレータが用意されている。

また、UNIX系のファイル I/O関数(システムコール/ライブラリ)で、 MS-DOS のディスクやCD-ROMを統一的にアクセスする機能を持つ。

本来なら、BTRON のシステムコールで統一的にアクセスできるようになるのが望ましいが、 BTRON のシステムコールは LINK(ファイルID) を基本にしており、 ファイル名を基本とする他の OS のファイルシステムとの適合性が低く難しい。

現時点では、UNIXエミュレータとして必要な全機能は実装されていない。 現時点で使用できるのは、セルフ開発環境として利用するのに必要な機能である。

MS-DOSのディスクは、フロッピーディスクまたはハードディスクの基本区画に対応 している。拡張区画には対応していない。また、読み出しのみで、書き込みはできない。

UNIX系のインクルードファイルは、(ベースディレトタリ)/include/unix に格納 されている。コンパイル時にこのパスをインクルードファイルの検索対象に 含めてある事を前提としている。使用可能なシステムコールは基本的にUNIXの仕様 と同じである。

1.2 ファイルとディレクトリ

UNIXのファイルには以下の種類がある。

このうち、デバイスファイルは未対応であるが、その他はBTRONにおける実身 に対応付けられる。
BTRONはディレクトリとファイルの区別はないが、UNIXファイルシステムをエミュレート するために下記のルールが適用される。

1.3 ファイル名

20文字を越えるファイル名を取り扱えるように、拡張ファイル名エンコード規約を定 め、UNIXエミュレータ環境においてのみ20文字を越えるファイル名を使用することが できるようにしている。

UNIXエミュレータを経由するファイルアクセスにおいて, ファイル名が20文字を超え、 ファイル名の全ての文字がASCII文字(ただし0x20〜0x7e)である場合にのみ、 拡張ファイル名エンコードを適用する。

UNIXエミュレータを経由しない場合は, アプリケーション側で拡張ファイル名エンコード に対応しない限り, 20文字を超えるUNIXファイルについて正しいファイル名を得ることはでき ない。ただし、エンコード後の実身名はBTRONの実身名の規約に従っているので, 実身そ のものを扱うことは可能である。

UNIXエミュレータ用のシェルである、ucliを通して取り扱う場合は正しいファイル名が 表示されるが、BTRONのアプリケーションで仮身を見ると文字化けする。

拡張ファイル名エンコード規約は以下の通りである。

1.4 関数一覧

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 )

1.5 パス名

ファイルを指すパス名は、以下の形式になる。

    /接続名/ディレクトリ名/ファイル名.拡張子
    (例) "/CD/DIR_1/FILE.EXT"

1.6 関数詳細

1.6.1 ファイルシステムの接続

#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_RONLY0x0001読み出しのみ
UX_BTRON0x0000BTRON ファイルシステム
UX_MSDOS0x0100MS-DOS ファイルシステム
UX_CDROM0x0200CD-ROM ファイルシステム
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。
備考:
現時点では、ファイルシステムとして指定できるのは UX_CDROM と UX_MSDOSの2つのみである。ただし、どちらも読み出しのみで、書き込みはできない。

1.6.2 ファイルシステムの切断

#include <bsys/unixemu.h>
int detach( const TC *devnm, int eject )

デバイス名 devnm のデバイスを切断する。

引数
eject0メディアを排出しない
1メディアを排出する
その他未定義(指定不可)
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.3 ファイルシステムのマウント

#include <sys/mount.h>
int mount(int type, const char *path, int flags, void *data)

ファイルシステムをディレクトリに接続する。正常終了した場合、指定したディレクト リへのアクセスはマウントしたファイルシステムのルートディレクトリへのアクセスに なる。マウント中は指定ディレクトリの元の内容を参照する事は出来ない。

引数
int typeファイルシステムのタイプ。
MOUNT_MSDOSMS-DOS
MOUNT_CD9660CD-ROM
MOUNT_BTRONFSBTRON
const char *pathマウントするディレクトリを指定する文字列。
int flags以下のビットの論理和。
MNT_RDONLYファイルシステムを読み取り専用にマウントする。
MNT_NOEXECファイルシステムからの実行を禁止する。
MNT_UNIONファイルシステムをファイルシステムツリーの一部と見なす。
void *dataデバイス名の文字列へのポインタ。"fda"など。
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。
備考:
ファイルシステムの type と指定できる flags には制限がある。MS-DOS、CD-ROM ファイルシステムについては読み出し専用である。

1.6.4 ファイルシステムのマウント解除

#include <sys/mount.h>
int unmount(const char *path, int flags)

マウントしていたファイルシステムをマウント解除する。

引数
const char *pathマウント解除するファイルシステムがマウントしているディレクトリのパス。
int flagsMNT_FORCE: 強制解除
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.5 新規ファイルの作成

#include <fcntl.h>
int creat(const char *path, mode_t mode)

通常ファイルの新規作成、またはpathが指すパス名によって指定された既存ファイル をオープンします。新規作成の場合は、プロセス・モード・マスクにより修正されたモ ードmodeが与えられます。

引数
const char *path新規に作成するファイルのパス。
mode_t modeファイルモード。
戻り値
>=0ファイルディスクリプタ。
-1エラー。 errnoにエラーコードを設定する。

1.6.6 ファイル/ディレクトリのオープン

#include <fcntl.h>
int open( const char *path, int oflag, .../*int mode*/ )

パス名pathのファイル/ディレクトリをオープンモードoflagでオープンする。 oflagには、次のうち1つを指定する。

O_RDONLY0x0000読み込みのみ
O_WRONLY0x0001書き込みのみ
O_RDWR0x0002読み込み書き込み
oflagには、オプションとして次のものを上記と OR で指定できる。
O_CREAT0x0200ファイルがなければファイル生成
ファイルがなければファイルを生成する。ファイルがすでにある場合にはこのフラグは何の効果もない。modeで指定されたモードでファイルを生成する
O_TRUNC0x0400ファイル内容削除
ファイルの内容を破棄し、ファイルサイズを0にする。ディレクトリに対して指定した場合は無視される。
O_EXCL0x0800ファイルがあればエラー
O_CREAT と合わせて指定する。ファイルがすでにある場合は、エラーとする。
戻り値
>=0ファイルディスクリプタ。
-1エラー。 errnoにエラーコードを設定する。

1.6.7 ファイル/ディレクトリのクローズ

#include <unistd.h>
int close( int fildes )

ファイルディスクリプタfildesのファイル/ディレクトリをクローズする。

戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.8 ファイル/ディレクトリポインタの移動

#include <unistd.h>
off_t lseek( int fildes, off_t offset, int whence )

ファイルディスクリプタfildesのファイル / ディレクトリポインタ ( バイト単位の位置 ) を移動する。

whenceSEEK_SET (0)offset の位置に移動
whenceSEEK_CUR (1)現在位置 + offset に移動
whenceSEEK_END (2)終端 + offset に移動
戻り値
>=0 正常終了。移動後の位置。
-1エラー。 errnoにエラーコードを設定する。

1.6.9 ファイルの読み込み

#include <unistd.h>
ssize_t read( int fildes, void *buf, size_t nbyte )

ファイルディスクリプタfildesのファイルの現在位置からnbyte バイトをbufへ読み込む。読み込んだバイト数分、ファイルの現在位置を進める。

戻り値
>=0 読み込んだバイト数。0 はファイルの終端を示す。
-1エラー。 errnoにエラーコードを設定する。

1.6.10 ファイルの書き込み

#include <unistd.h>
ssize_t write( int fildes, const void *buf, size_t nbyte )

ファイルディスクリプタfildesのファイルの現在位置から nbyteバイトへbufを書き込む。 書き込んだバイト数分、ファイルの現在位置を進める。

戻り値
>=0 正常終了。書き込んだバイト数。
-1エラー。 errnoにエラーコードを設定する。

1.6.11 データの入力

#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 iovcntiovec 配列のインデックス数。
戻り値
>=0 実際に読み取ったバイト数。
-1エラー。 errnoにエラーコードを設定する。

1.6.12 データの出力

#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 *iovpiovec 構造体配列へのポインタ。
int iovcntiovec 配列のインデックス数。
戻り値
>=0 実際に書き込んだバイト数。
-1エラー。 errnoにエラーコードを設定する。

1.6.13 ファイルの削除

#include <unistd.h>
int unlink(const char *path)

パス名pathのファイルを削除する。

引数
const char *path削除するファイルを指定するパス。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.14 ファイル名の変更

#include <stdio.h>
int rename(const char *from, const char *to)

fromが指すパスをtoにリネームする。

引数
const char *fromリネームするパス。
const char *toリネーム後のパス
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。
備考:
現状のインプリメントでは同一ディレクトリにおけるリネームのみに対応している。

1.6.15 ファイルサイズを指定長に設定する

#include <sys/types.h>
int truncate(const char *path, off_t length)
引数
const char *pathファイルサイズを変更するファイルのパス。
off_t length変更するサイズ。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.16 ファイルサイズを指定長に設定する

#include <sys/types.h>
int ftruncate(int fd, off_t length)
引数
int fdファイルサイズを変更するファイルのファイルディスクリプタ。
off_t length変更するサイズ。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.17 ファイル時間の設定

#include <sys/time.h>
int utimes(const char *path, const struct timeval *tptr)

pathで指定したファイルの変更時間を設定する。

引数
const char *path対象ファイルのパス。
const struct timeval *tptr変更する時間を格納した構造体へのポインタ。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。
備考:
現状変更可能なのは変更時間のみ。アクセス時間は設定できない。

1.6.18 ファイルシステム関連の制限値の取得

#include <unistd.h>
long pathconf(const char *path, int name)
引数
const char *pathファイル/ディレクトリのパス。
int name制限値の種類
戻り値
0 取得した制限値。
-1エラー。 errnoにエラーコードを設定する。

1.6.19 ファイル情報の取得

#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *ub)

pathで指定したファイルに関する情報を取得する。

引数
const char *path対象ファイルを指定するパス。
struct stat *ubstat構造体を指すポインタ。
戻り値
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]	      未使用

1.6.20 ファイル情報の取得

#include <sys/types.h>
#include <sys/stat.h>
int fstat(int fd, struct stat *sb)

引数のファイルディスクリプタが参照するオープンファイルのファイル情報を取得す る。stat()を参照。

戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.21 ファイル情報の取得

#include <sys/types.h>
#include <sys/stat.h>
int lstat(const char *path, struct stat *ub)

pathで指定したファイルに関する情報を取得する。 指定されたファイルがシンボリックリンクである事以外はstat()と同じ。 シンボリックリンクの場合はリンクについての情報を返す。stat()参照。

戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.22 ディレクトリの作成

#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は無効。

1.6.23 ディレクトリの削除

#include <unistd.h>
int rmdir(const char *path)

pathで指定したディレクトリを削除する。 ディレクトリには "." ".." 以外のエントリがあってはならない。 また、ルートディレクトリ、呼び出しプロセスのカレントデ ィレクトリであってはならない。

引数
const char *path削除するディレクトリ。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.24 ディレクトリエントリの取り出し

#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()は複数エントリを返す仕様だが、 現在のインプリメントは単一のエントリを返すので注意。

1.6.25 ディレクトリエントリの取得

#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にエラーコードを設定する。

1.6.26 ルートディレクトリの変更

#include <unistd.h>
int chroot(const char *path)

'/'で始まるパス名を検索する始点を変更する。 プロセスのカレントディレクトリに影響は与えない。

引数
const char *path変更後のルートディレクトリのパスを表す NULL 終端の文字列。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.27 カレントディレクトリの移動(1)

#include <unistd.h>
int chdir(const char *path)

パス名pathのディレクトリにカレントディレクトリを移動する。

引数
const char *path移動先のディレクトリを指定するパス。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.28 カレントディレクトリの移動(2)

#include <unistd.h>
int fchdir(int fd)

ファイルディスクリプタfdのディレクトリにカレントディレクトリを移動する。

引数
int fd移動先のディレクトリを指定するファイルディスクリプタ。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.29 シグナル動作の検査・変更

#include <signal.h>
int sigaction(int signum, const struct sigaction *nsa, struct sigaction *osa)

特定のシグナルに対応する動作の検査、および指定を行う。

引数
int signumシグナル番号
const struct sigaction *nsaNULLでない場合、指定するシグナルに対応する動作を指定する構造体へのポインタ
struct sigaction *osaNULLでない場合、指定するシグナルに対応する以前の動作を格納する構造体へのポインタ
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.30 シグナルマスクの検査、設定

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset)

呼び出したプロセスのシグナルマスクを検査、設定する。 setの値が NULLでない場合、 howの値によってプロセスのシグナルマスクを操作する。

引数
int howSIG_BLOCK: setにより指定したシグナル集合をプロセスのシグナルマスクに or する。
SIG_UNBLOCK: setにより指定したシグナル集合用いてプロセスのシグナルマスクをクリアする。
SIG_SETMASK: setにより指定したシグナル集合用いてプロセスのシグナルマスクを書き換える。
const sigset_t *setNULL でない場合、シグナル集合を意味する。
sigset_t *osetNULL でない場合、元のシグナルマスク値をコピーする。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.31 ファイルの制御

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ...)

オープン記述子上でさまざまな機能を実行する。詳細はUNIXシステムコールを参照 のこと。ただしすべての機能に対応しているわけではない。

1.6.32 デバイスの制御

#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構造体に基づき端末の状態を設定する。

1.6.33 シンボリックリンクの生成

#include <unistd.h>
int symlink(const char *path, const char *link)

pathで指定したファイルに対してlinkのシンボリックリンクを作成する。

引数
const char *pathシンボリックリンクにより参照されるファイル/ディレクトリのパス。
const char *linkシンボリックリンクのパス名。
戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.34 シンボリックリンク値の読み取り

#include <unistd.h>
int readlink(const char *path, char *buf, int count)

で指定したシンボリックリンクの値をbufに格納する。

引数
const char *pathシンボリックリンクのパス。
char *bufシンボリックリンクの値を格納するバッファのポインタ。値の末尾はNULLが付加されない。
int countbuf のサイズ。
戻り値
>=0バッファに格納された文字列のバイト数。
-1エラー。 errnoにエラーコードを設定する。

1.6.35 プロセス環境の複製

#include <bsys/unixemu.h>
int btron_prefork(void)

自プロセスの環境を複製し、子プロセス起動の用意をします。

戻り値
0 正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.36 プログラムの実行

#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にエラーコードを設定する。

1.6.37 プロセスの終了の待ち合わせ

#include <sys/wait.h>
pid_t wait( int *statusp)

シグナルを受信するか、その子プロセスが終了するまで呼び出したプロセスをブロック する。既にいずれかの子プロセスが終了しており、そのことがまだwait() を使用して通知されていない場合はそのような子プロセスのうちの一つのプロセスIDと 終了ステータスを格納してすぐに返る。子プロセスがない場合はすぐに返る。 正常終了した場合で statuspが NULLでない場合は wait()の戻り値で表される子プロセスの終了ステータスがstatuspで示される場所に格納される。

引数
int *statusp子プロセスの終了ステータスを記録するメモリへのポインタ
戻り値
>0 子プロセスID。
-1エラー。 errnoにエラーコードを設定する。

1.6.38 ファイルディスクリプタの複製

#include <unistd.h>
int dup(int fd)

fdしたファイルディスクリプタを複製し、戻り値として返す。 返されるファイルディスクリプタは、現在プロセスで使用されていない ファイルディスクリプタのうち最下位の番号である。

引数
int fd複製するファイルディスクリプタ。
戻り値
>=0 正常終了。複製されたファイルディスクリプタ。
-1エラー。 errnoにエラーコードを設定する。

1.6.39 ファイルディスクリプタの複製

#include <unistd.h>
int dup2(int from, int to)

ファイルディスクリプタ from を to に複製する。to が既に使用されている場合は cl ose() でクローズしたかのようにその割り当てを解除した後複製される。

引数
int from複製するファイルディスクリプタ。
int to複製後のファイルディスクリプタ。
戻り値
>=0複製後のファイルディスクリプタ。
-1エラー。 errnoにエラーコードを設定する。

1.6.40 パイプの生成

#include <unistd.h>
int pipe(int *fd)

パイプを生成し、fd[0]、fd[1]に二つのファイルディスクリプタを格納する。 fd[0]は読み取り用にオープンされ、fd[1]は書き込み用にオープンされる。

引数
int *fdint配列へのポインタ。
戻り値
>=0複製後のファイルディスクリプタ。
-1エラー。 errnoにエラーコードを設定する。

1.6.41 プロセスIDの取得

#include <unistd.h>
pid_t getpid(void)

カレントプロセスのプロセスIDを取得する。

戻り値
カレントプロセスのプロセスID

1.6.42 カレントプロセスの親プロセスIDの取得

#include <unistd.h>
pid_t getppid(void)

カレントプロセスの親プロセスIDを取得する。

戻り値
カレントプロセスの親プロセスID。

1.6.43 インターバルタイマーを設定する

#include <sys/time.h>
int setitimer(int which, const struct itimerval *itv, struct itimerval *oitv)
引数
int which設定するインターバルタイマー型。
const struct itimerval *itvNULLでない場合、インターバルタイマーを設定する構造体へのポインタ。
struct itimerval *oitvNULLでない場合、これまでのインターバルタイマーの設定を格納するアドレス。
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.44 インターバルタイマーの値の取得

#include <sys/time.h>
int getitimer(int which, struct itimerval *itv)
引数
int which取得するインターバルタイマー型。
struct itimerval *itvNULLでない場合、これまでのインターバルタイマーの設定を格納するアドレス
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.45 日付の獲得

#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にエラーコードを設定する。

1.6.46 資源利用情報の獲得

#include <sys/resource.h>
int getrusage(int who, struct rusage *rusage)

カレントプロセスによって利用された資源に関する情報を取得する。

引数
int whoRUSAGE_SELF カレントプロセス。
struct rusage *rusage情報を格納する構造体へのポインタ。
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。
備考:
who は RUSAGE_SELF のみ、struct rusage は ru_utime, ru_stime のみ対応。他は0を返す。

1.6.47 記述子テーブルサイズの獲得

#include <unistd.h>
int getdtablesize(void)
戻り値
新規作成記述子のインデックス最大値。

1.6.48 パス名-LINK変換

#include <bsys/unixemu.h>
int getlink( const char *path, char *buf )

UNIXエミュレータ上のアプリケーションから BTRON の実身を扱うためのインターフェース。パス 名から対応する実身の LINK を取得する。

引数
const char *pathLINK に変換するファイル/ディレクトリのパス
char *bufLINK を格納するメモリ。sizeof( LINK)以上の領域が必要。
戻り値
0正常終了。
-1エラー。 errnoにエラーコードを設定する。

1.6.49 FIFOスペシャルファイルの作成

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode)

ダミー。常にエラー終了する。

1.6.50 システム資源の最大消費量の制限値の取得

#include <sys/resource.h>
int getrlimit(int which, struct rlimit *rlp)

ダミー。正常終了する。

1.6.51 実/実効グループIDの設定

#include <unistd.h>
int setgid(gid_t gid)

ダミー。常にエラー終了する。

1.6.52 ユーザ/グループIDの変更チェック

#include <unistd.h>
int issetugid(void)

ダミー。常に0を返す。

1.6.53 スペシャルファイルの生成

#include <unistd.h>
int mknod(const char *path, mode_t mode, dev_t dev)

ダミー。常にエラー終了する。

1.6.54 ファイルモードの変更

#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path, mode_t mode)
int fchmod(int fd, mode_t mode)

ダミー。正常終了する。

1.6.55 ファイルのオーナー/グループの変更

#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)

ダミー。正常終了する。

1.6.56 ユーザIDの設定

#include <unistd.h>
int setuid(uid_t uid)

ダミー。常に正常終了する。

1.6.57 ユーザIDの取得

#include <unistd.h>
uid_t getuid(void)

ダミー。常に0を返す。

1.6.58 実効ユーザIDの取得

#include <unistd.h>
uid_t geteuid(void)

ダミー。常に0を返す。

1.6.59 ファイルフラグの変更

#include <sys/stat.h>
int chflags(const char *path, unsigned long flags)
int fchflags(int fd, unsigned long flags)

ダミー。正常終了する。

1.6.60 プロセスに対するシグナル送信

#include <signal.h>
int kill(pid_t pid, int signum)

ダミー。正常終了する。

1.6.61 データセグメントのサイズ変更

#include <unistd.h>
char *sbrk(int incr)

ダミー。常にエラー終了する。

1.6.62 メモリーのマップ

#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)

ダミー。常にエラー終了する。

1.6.63 メモリーのマップ解除

#include <sys/types.h>
#include <sys/mman.h>
int munmap(caddr_t *addr, size_t len)

ダミー。常にエラー終了する。

1.6.64 補助グループIDの獲得

#include <unistd.h>
int getgroups(int gidsetsize, gid_t *gidset)

ダミー。正常終了する。

1.6.65 プロセスグループの取得

#include <unistd.h>
pid_t getpgrp(void)

ダミー。常にエラー終了する。

1.6.66 実効グループIDの取得

#include <unistd.h>
gid_t getegid(void)

ダミー。常に0を返す。

1.6.67 グループIDの取得

#include <unistd.h>
gid_t getgid(void)

ダミー。常に0を返す。

1.6.68 ファイル作成モード/マスクの設定

#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t newmask)

ダミー。正常終了する。

1.6.69 ファイルとディスクの状態の同期

#include <unistd.h>
int fsync(int fd)

ダミー。正常終了する。

1.6.70 シグナルが発生するまで休止

#include <signal.h>
int sigsuspend(const sigset_t *mask)

ダミー。正常終了する。

1.6.71 日付の設定

#include <sys/time.h>
int settimeofday(const struct timeval *tv, const struct timezone *tzp)

ダミー。正常終了する。

1.6.72 バードリンクの作成

#include <unistd.h>
int link(const char *path, const char *link)

ダミー。エラー終了する。

1.7 エラーコード

errnoに設定されるエラーコードは以下の通り。

#include <errno.h>
ENOENTファイル/ディレクトリが存在しない
EBADFファイルディスクリプタが間違っている
EINVALパラメータが不正である
EIOI/O エラーが起きた
ENOMEMメモリ不足
EPERM操作が許可されていない
EINTRシステムコール中に割り込みが発生した
ENOEXEC実行形式エラー
ECHILD子プロセス不在エラー
EACCESパーミッションエラー
EFAULT不正アドレス
EBUSYデバイスが使用中
EEXISTファイルが既に存在している
EXDEVデバイス間のリンク
ENODEVそのデバイスではその操作がサポートされていない
ENOTDIRディレクトリでない
EISDIRディレクトリである
ENOTTYそのデバイスには不適切なioctl
ENOSPCデバイスフル
EROFS読み取り専用のファイルシステム

この章の目次にもどる