UNIXシステムコール

execv

execvも、execlと同様に、指定の実行ファイルを実行して、そのプロセスに置き換わる。 違いは、第2引数以降を配列で渡せるぐらい。Man page of EXECexecv_main.cを、として、 execv_sub.cを、とする。 $ vi execv_main.c $ vi execv_sub.c $ gcc execv_main.…

creat

creatは、openと同じでファイルを開くわけだが、openの第2引数に、O_CREAT|O_WRONLY|O_TRUNCのオプションを付けた状態と同じなので、既に存在しているファイルはサイズを0に切り詰めて、上書き保存のような形になる。Man page of OPEN /* ヘッダファイルのイ…

waitpid

waitpidは、プロセスIDを指定して、そのプロセスの終了などを待機できる。Man page of WAIT C言語forkメモ(Hishidama's C "fork" Memo) Pythonでos.fork()で生成した複数の子プロセスが終了するまで待機する方法 7-4. ネットワークサービスは必ずforkしよう5…

access

ファイルのアクセス権限をチェックするにはaccessを使う。Man page of ACCESS呼び出し元プロセスから見てアクセスできるかを判定する模様。 (基本的に実行したユーザってことかな・・・。)test.txtを普通に作った時のアクセス権限をチェックする。第2引数が…

unlink

ファイルの削除はunlinkで行う。Man page of UNLINKシンボリックリンクや、名前付きパイプなど、ファイルシステム上名前の付いているものは削除できる。 というか名前を削除して、その名前が参照しているファイル実体も削除するといったほうがいいかな・・・…

mknod

mknodで空のファイルを作成する。Man page of MKNOD通常ファイルも特殊ファイル(名前付きパイプやデバイスやソケットなど)も作成できる。今回は"test.txt"とパイプ"TEST1"を作成する。 ファイル名、そして付与するパーミッションを指定。 デバイスの場合、第…

symlink

symlinkはシンボリックリンクを作成する。Man page of SYMLINKシンボリックリンクが指し示すファイルパス、そしてシンボリックリンク名を指定する。成功すると0が返る。 $ pwd /home/bg1/project/cloud/github.com/Sample/unixsyscall/symlink/symlink/src/s…

mkdir

mkdirはディレクトリを作成する。Man page of MKDIRディレクトリを作成するときに、アクセス権限も指定する。これで、 $ vi mkdir.c $ gcc mkdir.c -o mkdir $ ls mkdir mkdir.c $ ./mkdir mkdir success! $ ls mkdir mkdir.c test_dir $ ls -al 合計 36 drw…

rename

renameは、ファイル名の変更や移動に使う。Man page of RENAMEファイル名"test.txt"を"test1.txt"に変更する。これで、 $ vi rename.c $ gcc rename.c -o rename $ ls rename rename.c $ vi test.txt $ cat test.txt ABCDE $ ls rename rename.c test.txt $ …

dup

dupはファイルディスクリプタを複製する。Man page of DUP"test.txt"をopenで開いて、その時のファイルディスクリプタをdupに渡すと、新しいファイルディスクリプタが返される。 そのファイルディスクリプタも"test.txt"を指すので、複製といえる。"ABC"を古…

kill

killは、プロセスにシグナルを送る。Man page of KILL名前からして、プロセスを終了させるシステムコールに感じそうだが、必ずしもそうではない。 あくまで、シグナルを送るのであって、送るシグナルがプロセス終了の場合が多いだけ。forkをして、親プロセス…

pause

pauseはシグナルが発生するまで待つ。Man page of PAUSESIGALRMが発生するまで待つ。10秒経ったらSIGALRMが発生するので、それまで待っているかどうか。 $ pwd /home/bg1/project/cloud/github.com/Sample/unixsyscall/pause/pause/src/pause $ ls pause.c $…

alarm

alarmに秒数を指定することで、指定した秒後にシグナルSIGALRMを発生させる。Man page of ALARMこれを使って、アラーム(タイマー)処理を行うことができる。3秒後にSIGALRMを発生させ、handlerで拾う。 $ vi alarm.c $ gcc alarm.c -o alarm $ ./alarm proces…

termios構造体

シリアル通信の設定は、termios構造体で行う。Man page of TERMIOSメンバ変数のc_iflag, c_oflag, c_cflag, c_lflag, メンバ配列のc_ccにフラグや値がセットしてあるので、それを出力して、設定を確認する。 ただ、その前に、どんなフラグがあって、どういう…

TCSETS

ioctlシステムコールにTCSETSとtermios構造体変数を渡すと、指定のファイルディスクリプタに端末情報を設定できる。Man page of TTY_IOCTLTCSETSの使いどころというと、やはりシリアル通信だろう・・・。 ということで、シリアル通信を始める。 といっても、…

TCGETS

ioctlシステムコールにTCGETSを渡すことで、指定のファイルディスクリプタの指す端末情報を取得できる。Man page of TTY_IOCTLこれを使うと、リダイレクトによるファイル出力か、標準入出力かを判定できる。TCGETS1.cは標準出力について判定するものである。…

stat構造体

stat構造体(struct stat)は、ファイル情報を格納するために使う。 (stat関数と同じstatでややこしいが・・・。)Man page of STAT今回は、指定されたファイルの所有者のユーザーIDを取得する。sst.st_uidに、そのファイルの所有者のユーザーIDが整数で入って…

tm構造体

tm構造体(struct tm)は時刻情報を格納するために使う。Man page of CTIME C言語関数辞典 - tm構造体今回は、tmのメンバであるtm_wdayが、日曜~土曜を0から6の値で表していることを利用し、"Sun"から"Sat"までの文字列配列の添字にtm_wdayを渡すことで、曜日…

handler

シグナルハンドラをセットして、指定のシグナルが来たら、独自処理を行うようにしてみる。Man page of SIGNALハンドラ関数名はなんでもいいが、今回は便宜的にhandlerにする。 handlerの引数には、受け取ったシグナルのシグナル定数が渡される。このような感…

signal

signalは、そのプロセスに送られたシグナルに対する処理をどうするか設定を変更したり、ハンドラをセットして独自の処理を行わせることができる。Man page of SIGNALプロセス実行中にCtrl+CによりSIGINTシグナルが送られた時、デフォルトの動作ではプロセス…

getdelim

getdelimは、getlineの引数に加えて、区切り文字(デリミタともいう)を指定できる。Man page of GETLINEtest.txtを、 $ cat test.txt ABCDE;FGHIJ KLMNO;PQRST UVWXYZ$catで見ると、このようなテキストに編集する。 改行とは別にセミコロン(';')でも区切って…

getline

C++のgetline(後で扱う)に行く前に、C言語にもgetlineはある。Man page of GETLINE行ごとに文字列を取得していくが、C++の場合と違って、区切り文字(デリミタ)指定の引数が無い。 (その場合は、getdelimを使う模様・・・。) また、ISO非標準(POSIX標準)なの…

link

linkは、ファイルのハードリンクを作成するのに使う。シンボリックリンクとハードリンクの違い - Qiita シンボリックリンクの使い方と落とし穴 - Qiita Manpage of LINK ファイルの別名を作成する(ハード・リンク) | C言語入門講座link.cで、"test1/test1.…

ioctl

ioctlは、デバイスを制御するのに使う。Man page of IOCTL今回は、ネットワークデバイスであるNICからIPを取得する。ioctl.cで、インターフェース名を入力。 ioctlでSIOCGIFADDRを送る。 成功するとstruct ifreq型のsifrに情報が格納される。 $ ifconfig enp…

msync

msyncでメモリマップの内容に合わせてファイルを同期する。Man page of MSYNCmsync.cで、"test.txt"を開いたら、内容を"VWXYZ"に書き換えて、msyncで同期する。 $ ls msync msync.c test.txt $ vi msync.c $ gcc msync.c -o msync $ vi test.txt $ cat test.…

mmap

mmapは、ファイルの内容をメモリにマッピングすることで高速にアクセスできる。Man page of MMAPmmap.cで、ファイルサイズを取得し、メモリのページサイズも取得し、メモリマップサイズを計算。 "test.txt"を開いて、メモリにマッピング。 メモリマップの中…

isatty

isattyは、ファイルディスクリプタが端末を参照しているかどうかを返す。Man page of ISATTYわかりにくいので補足すると、ファイルディスクリプタの出力先が標準出力であれば、端末は参照されていると言えるし、 リダイレクトなどで、ファイルなどに出力され…

fileno

filenoは、指定されたファイルポインタの指すストリームのファイルディスクリプタを返す。Man page of FERRORstdio.hだが、標準関数一覧には何故かない。 fileno.cで、stdin, stdout, stderr, そして新たに開いた"test.txt"のファイルディスクリプタを出力。…

getpagesize

getpagesizeは、メモリのページサイズを取得する。Man page of GETPAGESIZEgetpagesize.cで、これだけ。 $ vi getpagesize.c $ gcc getpagesize.c -o getpagesize $ ./getpagesize page_size = 4096 $4096Bらしい。Sample/unixsyscall/getpagesize/getpagesi…

iconv

iconvは、文字コード変換をする。Man page of ICONV「どの文字コードからどの文字コードへ変換するか」といった情報を指定して、変換ディスクリプタを取得しないといけない。test1.txtを読み込みbufに格納。 "utf-8"から"Shift_JIS"へ変換するディスクリプタ…