システムコールとはLinuxやUnixが提供する機能をC言語から使うためのAPI関数です。その一覧と使い方をご紹介します。
システムコール | 説明 |
---|---|
bind | ソケットをバインドする。 |
close | ファイルディスクリプタを閉じる。 |
creat | ファイルを作成する。 |
dup | ファイルディスクリプタを複製する。 |
execve | プログラムを実行する。 |
fork | 子プロセスを作成する。 |
stat | パス名で指定したファイルの状態を取得する。指定したファイルがシンボリックリンクの場合は、リンクが参照しているファイルの状態を返す。 |
fcntl | ファイルディスクリプタの操作を行う。 |
fstat | ファイルディスクリプタで指定したファイルの状態を取得する。 |
lstat | パス名で指定したファイルの状態を取得する。指定したファイルがシンボリックリンクの場合は、リンクが参照しているファイルではなく、シンボリックリンク自身の状態を返す。 |
open | ファイルを開く。 |
openat | ファイルを開く。 |
poll | ファイルディスクリプタ上の何らかのイベントを待つ。 |
read | ファイルディスクリプタから読み出す。 |
socket | 通信のエンドポイントを作成する。 |
write | ファイルディスクリプタへ書き込む。 |
closeはファイルディスクリプタを閉じるシステムコールである。
#include <unistd.h>
int close(int fd);
ファイルディスクリプタのクローズに成功すると、openは0を返す。クローズに失敗すると-1を返し、errnoにエラー番号がセットされる。
fd
は有効なオープンファイル記述子ではありません。close()
の呼び出しがシグナルによって中断されました。forkは子プロセスを作成するシステムコールである。
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
fstatはファイルの状態を取得するシステムコールである。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int fstat(int fd, struct stat *statbuf);
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
ファイルディスクリプタで指定する以外は、statと同じである。
lstatはファイルの状態を取得するシステムコールである。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int lstat(const char *pathname, struct stat *statbuf);
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
openはファイルを開くシステムコールである。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
フラグ | 説明 |
---|---|
O_APPEND | アペンド(追加)モードでファイルを開く。 |
O_CREAT | もしpathnameで指定したファイルが存在しなければ、ファイルを作成する。 |
O_DIRECTORY | もしpathnameで指定したパスがディレクトリでなければ、ファイルのオープンに失敗する。 |
ファイルのオープンに成功した場合、ファイル記述子を返す。ファイルのオープンに失敗した場合、-1 を返す。
readはファイルディスクリプタから読み出すシステムコールである。
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
statはファイルの状態を取得するシステムコールである。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *statbuf);
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
writeはファイルディスクリプタへ書き込むシステムコールである。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
システムコールを呼び出した際にエラーが発生すると、外部変数 errno にエラー番号が格納される。
同じ意味のエラーでも、プラットフォームによりエラー番号が異なることがある。
標準Cライブラリーのperror関数で、エラー番号に対応するシステムエラーメッセージを標準出力に出力することができる。
Operation not permitted
操作は許可されていない。
プラットフォーム | エラー番号 |
---|---|
Solaris | 1 |
Tru64 UNIX | 1 |
Microsoft Windows | 1 |
Ubuntu | 1 |
No such file or directory
ファイルまたはディレクトリが存在しません。
プラットフォーム | エラー番号 |
---|---|
Solaris | 2 |
Tru64 UNIX | 2 |
Microsoft Windows | 2 |
No such process
プロセス、LWP、またはスレッドが存在しません。
プラットフォーム | エラー番号 |
---|---|
Solaris | 3 |
Tru64 UNIX | 3 |
Microsoft Windows | 3 |
Interrupted system call
システムコールに割り込みが発生しました。
プラットフォーム | エラー番号 |
---|---|
Solaris | 4 |
Tru64 UNIX | 4 |
Microsoft Windows | 4 |
I/O error
プラットフォーム | エラー番号 |
---|---|
Solaris | 5 |
Tru64 UNIX | 5 |
Microsoft Windows | 5 |
No such device or address
プラットフォーム | エラー番号 |
---|---|
Solaris | 6 |
Tru64 UNIX | 6 |
Microsoft Windows | 6 |
Arg list too long
プラットフォーム | エラー番号 |
---|---|
Solaris | 7 |
Tru64 UNIX | 7 |
Microsoft Windows | 7 |
Exec format error
プラットフォーム | エラー番号 |
---|---|
Solaris | 8 |
Tru64 UNIX | 8 |
Microsoft Windows | 8 |
Bad file number
プラットフォーム | エラー番号 |
---|---|
Solaris | 9 |
Tru64 UNIX | 9 |
Microsoft Windows | 9 |
No child processes
プラットフォーム | エラー番号 |
---|---|
Solaris | 10 |
Tru64 UNIX | 10 |
Microsoft Windows | 10 |
Resource temporarily unavailable
プラットフォーム | エラー番号 |
---|---|
Solaris | 11 |
Tru64 UNIX | 35 |
Microsoft Windows | 11 |
Not enough space
プラットフォーム | エラー番号 |
---|---|
Solaris | 12 |
Tru64 UNIX | 12 |
Microsoft Windows | 12 |
Permission denied
プラットフォーム | エラー番号 |
---|---|
Solaris | 13 |
Tru64 UNIX | 13 |
Microsoft Windows | 13 |
Bad address
プラットフォーム | エラー番号 |
---|---|
Solaris | 14 |
Tru64 UNIX | 14 |
Microsoft Windows | 14 |
Block device required
プラットフォーム | エラー番号 |
---|---|
Solaris | 15 |
Tru64 UNIX | 15 |
Microsoft Windows | - |
Device busy
プラットフォーム | エラー番号 |
---|---|
Solaris | 16 |
Tru64 UNIX | 16 |
Microsoft Windows | 16 |
File exists
プラットフォーム | エラー番号 |
---|---|
Solaris | 17 |
Tru64 UNIX | 17 |
Microsoft Windows | 17 |
Cross-device link
プラットフォーム | エラー番号 |
---|---|
Solaris | 18 |
Tru64 UNIX | 18 |
Microsoft Windows | 18 |
No such device
プラットフォーム | エラー番号 |
---|---|
Solaris | 19 |
Tru64 UNIX | 19 |
Microsoft Windows | 19 |
Not a directory
プラットフォーム | エラー番号 |
---|---|
Solaris | 20 |
Tru64 UNIX | 20 |
Microsoft Windows | 20 |
Is a directory
プラットフォーム | エラー番号 |
---|---|
Solaris | 21 |
Tru64 UNIX | 21 |
Microsoft Windows | 21 |
Invalid argument
不正な引数です。
プラットフォーム | エラー番号 |
---|---|
Solaris | 22 |
Tru64 UNIX | 22 |
Microsoft Windows | 22 |
File table overflow
プラットフォーム | エラー番号 |
---|---|
Solaris | 23 |
Tru64 UNIX | 23 |
Microsoft Windows | 23 |
Too many open files
プラットフォーム | エラー番号 |
---|---|
Solaris | 24 |
Tru64 UNIX | 24 |
Microsoft Windows | 24 |
Inappropriate ioctl for device
プラットフォーム | エラー番号 |
---|---|
Solaris | 25 |
Tru64 UNIX | 25 |
Microsoft Windows | 25 |
Text file busy
プラットフォーム | エラー番号 |
---|---|
Solaris | 26 |
Tru64 UNIX | 26 |
Microsoft Windows | - |
File too large
プラットフォーム | エラー番号 |
---|---|
Solaris | 27 |
Tru64 UNIX | 27 |
Microsoft Windows | 27 |
No space left on device
デバイスに空き領域がありません。
プラットフォーム | エラー番号 |
---|---|
Solaris | 28 |
Tru64 UNIX | 28 |
Microsoft Windows | 28 |
write(2)システムコールは、直接ディスクに書き込むわけではありません。書き込みをスケジュールするだけです。ディスクの空き領域が足りない場合でも、ENOSPCでエラーになるとは限りません。書き込みに成功したかどうかは、fsync(2)を呼び出したうえ、close(2)の戻り値を確認する必要があります。
Illegal seek
プラットフォーム | エラー番号 |
---|---|
Solaris | 29 |
Tru64 UNIX | 29 |
Microsoft Windows | 29 |
Read-only file system
プラットフォーム | エラー番号 |
---|---|
Solaris | 30 |
Tru64 UNIX | 30 |
Microsoft Windows | 30 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 31 |
Tru64 UNIX | 31 |
Microsoft Windows | 31 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 32 |
Tru64 UNIX | 32 |
Microsoft Windows | 32 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 33 |
Tru64 UNIX | 33 |
Microsoft Windows | 33 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 34 |
Tru64 UNIX | 34 |
Microsoft Windows | 34 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 35 |
Tru64 UNIX | 80 |
Microsoft Windows | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 36 |
Tru64 UNIX | 81 |
Microsoft Windows | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 37 |
Tru64 UNIX | - |
Microsoft Windows | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 38 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 39 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 40 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 41 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 42 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 43 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 44 |
Tru64 UNIX | - |
プラットフォーム | エラー番号 |
---|---|
Solaris | 45 |
Tru64 UNIX | 11 |
Microsoft Windows | 36 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 46 |
Tru64 UNIX | 77 |
Microsoft Windows | 39 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 47 |
Tru64 UNIX | 94 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 48 |
Tru64 UNIX | 99 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 49 |
Tru64 UNIX | 69 |
プラットフォーム | エラー番号 |
---|---|
Solaris | 50 |
Tru64 UNIX | - |