だてブログ

ねことテクと趣味のブログ

実用UNIXシステムプログラミングメモ

ファイルの入出力

  • ディスクファイル, デバイス-> ファイル
  • ファイルをオープンする
  • ファイル、デスクリプタに対しリード・ライトを行う
  • ファイルをクローズする
 ファイルディスクリプタFilds 標準入出力Path
0 標準入力 - stdin
1 標準出力 - stdout
2 標準エラー - stderr

低水準入出力

 read(filds, buf, nbyte)  ファイルのデータを読む
 write(filds, buf, nbyte)  ファイルへデータを書く
 create(path, mode)  ファイルを作り、書き込みの準備を行う
 open(path, oflag[, mode])  ファイルをオープンする
 close(filds)  ファイルをクローズする
 lseek(filds, offset, whence)  リード、ライトポインタをバイト単位に移動
 dup(filds)  すでにオープンされているファイルディスクリプタをコピーする

ファイルの属性のコントロール

 link(path1, path2)  ファイルにリンクする
 unlink(path)  ファイルをアンリンクする
 access(path, amode)  ファイルのアクセスモードを返す
 stat(path, buf)  ファイルのステータスを得る
 ttyname(filds)  指定したファイルディスクリプタに対するターミナル名を返す
 ustats(dev, buf)  ファイルシステムの状態を得る
 chown(path, owner, group)  ファイルのオーナーの変更
 chmod(path, mode)  ファイルのアクセスモードの変更
 umask(cmask)  ファイル作成時のデフォルトのアクセスモードの設定
 chdir(path)  カレントワーキングディレクトリを変更する
 utime(path, times)  ファイルのアクセス時間、変更時間を更新する
 fcntl(filds, cmd, arg)  ファイルコントロール

高水準入出力

低水準入出力を組み合わせたサブルーチン群からできている バッファイルングを行う、豊富な入出力コール群

 fopen(path, type)  高水準入出力としてファイルをオープンする
 freopen(path, type, stream)  ファイルを再オープンする
 fdopen(filds, type)  すでに得られているファイルディスクリプタに対し、FILE型コントロール
 fclose(fp)  指定されたファイルをクローズする
 getc(fp)  指定されたファイルより1文字入力する
 putc(c, fp)  指定されたファイルより1文字出力する
 fgetc()  指定されたファイルより1文字入力する関数版
 fputc()  指定されたファイルより1文字出力する関数版
 getw()  指定したファイルより1ワード(int)のデータを入力する
 putw()  指定したファイルより1ワード(int)のデータを出力する
 getchar()  getc(stdin),標準入力から1文字入力する
 putchar()  petc(stdin),標準入力から1文字出力する
 fgets(s, n, fp)  1行の入力
 fputs(s, fp)  1行の出力
 fflush(fp)  バッファをフラッシュする
 feof(fp)  ファイルリード/ライトポインタがEOFの位置にあるかを調べる
 ferror(fp)  リード/ライト処理にエラーがなかったかを調べる
 ftell(fp)  ファイルの先頭からの(バイト)オフセットを得る
 fseek(fp, offset, ptrname)  ファイルポインタを移動する
 rewind(fp)  ファイルポインタを先頭に移動する
 setbuf(fp, buf)  バッファを割り付ける
 fileno(fp)  ファイルディスクリプタを得る
 ungetc(c, fp) 入出力バッファに文字を戻す
 scanf(format[, pointer])  標準入力からの書式付き入力
 fscanf(fp, format[, pointer])  指定したファイルから書式付き入力
 sscanf(s, format[, pointer])  指定したストリングバッファの書式付き内部変換
 printf(format[, arg])  標準出力への書式付き出力
 fprintf(fp, format[, arg])  指定したファイルへの入出力
  sprintf(s, format[, arg])  指定したストリングへの書式付き内部変換
 fwrite((char *)p, sizeof(* p), n, fp)  バイナリライト
 fread((char *)p, sizeof(* p), n, fp)  バイナリリード

テンポラルファイル

 tmpnam(s)  テンポラルファイルのためのファイル名を作る
 mktemp(template)  テンポラルファイルのためのユニークなファイル名を作る
 tempfile()  テンポラルファイルを作る。プロセスが終わると消去

バイススペシャルファイルを作る

 mknod(path, mode, dev)  ファイルを作る(普通の、ディレクトリ、FIFO,デバイススペシャルファイル)

ディスクをマウント

 mount(spec, dir, rwflag)  ファイルシステムをマウント
 unmount(spec)  ファイルシステムをアンマウント

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

 chroot(path)  ルートディレクトリを変更する

システムコールエラーの出力

とextern int errno; -> っ最後に発生したシステムコールのエラー番号 とstrerror() -> エラーメッセージの一覧表

プロセスの生成、待ちと終了~並行動作、順次動作、待ち合わせ、終了方法~

UNIX=タイムシェアリングシステム/マルチプログラミング 一つのプログラムが動く=1プロセス必ずfork()コール プログラムファイルを実行する->必ずexec()コール

 fork()  子プロセスを作る
 execコール  指定された実行可能なファイルから現在のプロセスにプログラムからロードされる
 execl(path[, arg0[, arg1...]], 0) 実行可能なプログラムファイルからプログラムをロードして実行
 execv(path[, argv])  実行可能なプログラムファイルからプログラムをロードして実行する
 execle(path[, arg 0[, arg1...]], envp)  同上。この時、環境変数を渡せる
 execve(path, argv, envp)  プログラムファイルを実行する。この時環境変数を渡せる
 execlp(file, [arg 0[, arg1..]], 0) 実行可能プログラムファイルからプログラムorシェルプロージャをロード実行する
 execrp(file, argv)  実行可能プログラムファイル、またはシェルプロシージャをロード実行する
 exit(status)  プロセスを終了する
 wait(status)  子プロセスの終了を待つ
 sleep(second)  指定秒するだけプログラムの実行を休止する

プロセスIDと属性

 pid  0~30000の番号をUNIx上の動的なプロセスに振り分ける
 pgid  プロセスグループリーダーに振り分けられるID
 tty group  あるプロセスのプロセスグループリーダが特定のターミナルと関連を持っていればそのプロセスはそのターミナルグループに属する
 ruid  システム上のすべてのユーザーが持つユーザーID
 rgid  システム上のすべてのユーザーが持つリアルグループID
 euid  effective-userIDファイルアクセス可否を決めるときに使用させるユーザーID
 egid  ↑と同じ。set-group-ID, bit かそのまま引き継がれるか
 getpid()  プロセスIDを得る
 getgpid()  プロセスグループIDを得る
 getppid()  親プロセスのプロセスIDを得る
 getuid()  real user ID を得る
 geteuid()  effective user IDを得る
 getgid()  real group IDを得る
 getegid()  effective group IDを得る
 setuid(uid) ユーザーIDを設定する
 setgid(gid)  グループIDを設定する
 setpgrp()  プロセスグループIDを設定する
 nice()  nice値を変更する nice値が小さいほどCPU使用権優先度が高い

パイプ

UNIX上のプロセスたちはパイプを利用してデータの受け渡しができる パイプを用いるときは、システムコールにより得られたパイプ用のファイルディスクリプタに対し、read/writeシステムコールを使ってデータの転送を行う

 pipe(filds)  パイプ用ファイルディスクリプタを得る
 popen(command, type)  指定したコマンドとパイプ入出力を行う準備をする
 pclose(fp)  オープンされたパイプファイルポインタをクローズする

メッセージ

メッセージ、キューイング、プロセスのブロック

 msgget(key, msgflg)  メッセージID(msgid)を割り付ける
 msgsnd(msgid, msgp, msgs2, msgflg) メッセージを送信します
 msgrcv(msgid, msgp, msgs2, msgtyp, msgflg)  メッセージを受信する
 magctl(msgid, cmd, buf)  メッセージをコントロールする

シグナル

シグナル…プロセス内外(orコンピューター内外)から発生する割り込み、非同期(ランダム) トランザクション:データベースを更新する処理 全てのパソコンにデーモンは備わっていて、何かしらバックで動いている(常駐プロセス-入力待ちなど)

 abort() 自らのプロセスにSIGIOTを送る
 alarm(sec)  アラームクロックを設定する
 pause()  シグナルを受けるまでサスペンドする
 kill(pid, sig)  プロセスにシグナルを送る
 signal(sig, func)  シグナル処理を定義
 1   SIGHUP  シグナル/EXITで終了  11 SIGSEGV 不正なメモリアクセス
 2   SIGINT  インタラプトキー入力  12 SIGSYS システムコールの引数エラー
 3   SIGQUIT  Ctrl + \  13 SIGPIPE 不確定のパイプI/Oで行った
 4   SIGILL  未定義命令  14 SIGALRM ALARM()システムコール
 5   SIGTRAP  トレーストラップ  15 SIGTERM killコマンドデフォ
 6   SIGIOT  abort()を呼ぶ  16 SIGUSR1
 7   SIGEMT  out of memory  17 SIGUSR2
 8   SIGPPE  オーバーフロー、アンダーフロー、ゼロディバイド  18 SIGCLD
 9   SIGKILL  キルコマンド  19 SIGPWR  システムの電源が入った時、システムの初期化を行った後に発生
 10 SIGBUS CPUパスエラー

セマフォ

セマフォ…複数のプロセス間でプログラム実行の同期をとるために用いられる道具 セマフォ値 - 0 : ロック、 1 : アンロック

 semget(key, nsems, semflg)  セマフォID, セマフォ値の記憶領域を得る
 semop(semid, sops, nsops)  セマフォのロック、アンロックをする
 semctl(semid, semnum, cmd, ary) セマフォ値の初期設定、セマフォIDのクリア

時間管理

UNIXシステムはO年O月O日O時O分O秒を通算病で1970年1月1日0/0/0からをシステムタイムとしている

 time(tloc)  時刻を得る(通算秒)
 stime(tp)  時刻と日付を設定する
 times(buffer) 自ら子プロセスのCPU消費時間を得る
 ctime(tp)  通算病をASCIIストリングに変換する
 localtime(clock)  ローカルタイムを得る
 gmtime(clock)  グリニッジ標準時を得る

メモリ割付と開放

一つのプロセスの使用するデータセグメントには使用限界アドレス(break value)がある。

 malloc(size)  メモリの割付要求。sbrk()より拡張もできる
 free(ptr) 割り付けられたメモリをプロセスから解放する
 realloc(ptr, size)  割り付けられたメモリの大きさを変更する
 calloc(nelem, elsize)  ブロックでメモリを割り付ける
 brk(endds)  データセグメント領域を変更する
 sbrk(incr)  データセグメント領域を変更する
 unlimit(cmd, newlimit)  ファイル/メモリのユーザ限界を取得、ファイルサイズの上限を設定する

共有メモリ

共有メモリ…複数プロセスで共通にアクセス(参照)される領域、各プロセスに同一メモリがマッピングされる

 shmget(key, size, shmflg) 共有メモリをシステムに割り付ける
 shmat(shmid, shmaddr,shmf)  共有メモリの先頭アドレスを得る
 shmdt(shmaddr)  共有メモリの使用権を放棄する
 shmctl(shmid, cmd, buf)  共有メモリをコントロールする

SetjumpとLongJmp

 setjmp(env)  longjmp()コールのときにジャンプするポイントを記憶する
 longjmp(env, val)  setjmp()コールで設定された場所にジャンプする

ユーザー管理の環境

 マスタデータ構造
 /etc/password  ログイン名とuid/gidを対応付けている。ほかパスワード、ログインホームディレクトリ、イニシャルプログラム
 /etc/group  グループ名とgidと対応付けるファイル
 プログラム
 /etc/getty  ターミナルstdinを監視し、入力あれば/etc/loginにexecし、ユーザ名の入力を行う
 /etc/login  ログイン名の入力とパスワードによるユーザの検証を行う
 ログイン/ユーザ登録
 /etc/utmp  現在ログインしているユーザのログイン名とターイなるとログイン時間
 /etc/wtmp  ログインの履歴、ファイルが大きくなりがち
 getpwent()  /etc/passwdのエントリを一行得る
 getlogin()  現在のプロセスのログイン名を得る
 getpwuid(uid)  /etc/passwdの中に指定されたユーザIDのエントリを探す
 getpwnam(name)  指定されたログイン名に等しい /etc/passwdのエントリを得る
 getpass(prompt)  パスワードを読む

レギュラ・エクスプレッションの利用

 regcmp(regst1[, regst2, ]...) 正規表現を含んだストリングを内部表現に変換する
 regex(name, string[, ret0,...]) ↑で変換した内部表現と指定されたストリングを比較する

文字と文字列操作

 isalpha(c)  アルファベットか  isspace(c) スペース/タブ/ニューラインか
 islower(c)  小文字か  ispunct(c) 特殊文字
 isupper(c)  大文字か  isprint(c)  スペース含表示可能か
 isdigit(c)  数字か  isgraph(c) 表示可能か
 isxdigit(c)  16進数か  iscntrl(c) 制御文字か
 isalnrm(c)  アルファベットか数字か  isascii(c) ascii文字か
 toupper(c)  小文字->大文字  _toupper(c) マクロ 小文字->大文字
 tolower(c)  大文字->小文字  _tolower(c)  マクロ 大文字->小文字
 文字列の操作
 ストリングの結合  strcat(), strncat() ストリング内文字検索 strchr(), strrchr()
 ストリングの比較  strcmp(), strncmp() ストリング内ストリング検索 strpbrk(), strspn(), strcspn()
 ストリングのコピー/移動  strcpy(), strncpy() ストリングをデリミッタで分離 strtok()
 ストリングの長さ  strlen()
 sweb() 16bitの単位に上位バイトを下位バイトを入れ替える

ほか

include <error.h>必要

exit()引数必要 スレッドセーフではない - スレッドで使うとおかしくなる

参照:

実用UNIXシステムプログラミング https://www.amazon.co.jp/%E5%AE%9F%E7%94%A8UNIX%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%A1%A9%E8%B0%B7-%E4%BF%AE/dp/4526020540