UNIXシステムコール

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"へ変換するディスクリプタ…

stat

statは、ファイルの情報や状態を取得する。Man page of STAT指定されたパスのファイル情報をstat構造体に格納する。"test.txt"のファイルサイズを調べる。 $ ls stat stat.c test.txt $ vi test.txt $ ls -al 合計 28 drwxrwxr-x. 2 h.miura h.miura 4096 8…

mkfifo

mkfifoは、名前付きパイプを作成する・・・。Man page of MKFIFO親プロセスと子プロセスの関係なら、forkでpipeを共有できるが、全く関係ない2つ以上のプロセス間で通信する場合は、名前付きパイプを使う・・・。 名前付きパイプはファイルのようなもので、l…

pipe

pipeは、プロセス間通信に使う名前なしパイプを生成するシステムコール・・・。Man page of PIPE引数には要素数2のint型配列を渡す・・・。0番目が読み込み用、1番目が書き込み用に使われる・・・。 主に、親プロセスと子プロセスの間でのプロセス間通信に使…

pthread_rwlock_wrlock

pthread_rwlock_wrlockは、ライトロックを掛けるライブラリ関数・・・。pthread_rwlock_wrlock(3) - Linux man page値を参照する場合は、リードロックを掛けた・・・。 値を変更する場合は、ライトロックを掛ける・・・。 そして、リードロック×ライトロック…

pthread_rwlock_rdlock

pthread_rwlock_rdlockは、リードロックを掛けるライブラリ関数・・・。pthread_rwlock_rdlock(3) - Linux man pageあるスレッドが参照しようとしている値を、他のスレッドが参照する場合はロックする必要はないという考えから、リードロック同士なら実際に…

pthread_mutex_lock

pthread_mutex_lockは、ミューテックスをロックするライブラリ関数・・・。Man page of PTHREAD_MUTEXこれまで、並列に実行してきたスレッド間で同期を取る方法はいくつかあるが、ミューテックスはそのひとつ・・・。pthreadについて(同期) (1/4):CodeZin…

pthread_detach

pthread_detachは、スレッドをデタッチするライブラリ関数・・・。Man page of PTHREAD_DETACHこれを使って、後からスレッドをデタッチ状態にすることもできる・・・。このように、スレッドを作成してから、pthread_detachでそのスレッドをデタッチ状態にす…

pthread_attr_setdetachstate

pthread_attr_setdetachstateは、スレッド属性のうち、デタッチ状態に関する設定をするライブラリ関数・・・。Man page of PTHREAD_ATTR_SETDETACHSTATE前回は、合流可能なスレッドとしてスレッド作成したが、今回はこれを使ってデタッチするような設定にす…

pthread_attr_init

pthread_attr_initは、スレッド属性を初期化するライブラリ関数・・・。Man page of PTHREAD_ATTR_INITスレッドには、さまざまな属性を付加することができる・・・。 今回は、スレッド属性の初期化をpthread_attr_initで行ったら、pthread_attr_setdetachsta…

pthread_exit

pthread_exitは、スレッドを終了するライブラリ関数・・・。Man page of PTHREAD_EXITこれまで、return文でstart_routineを終了していたが、プロセスにおけるexitと同様に、スレッドにおいてはpthread_exitで終了できる・・・。 引数は終了コードを格納した…

pthread_join

pthread_joinは、別のスレッドが終了するまで待つライブラリ関数・・・。Man page of PTHREAD_JOIN第2引数に変数のアドレスを渡すと、start_routineの終了コードをその変数に格納する・・・。 終了まで待つと同時に、終了コードも取得できるという形・・・。…

start_routine

ワーカースレッドで実行する処理は、start_routine(名前変更可)に記述する・・・。 このワーカースレッドに、メインスレッドからパラメータを渡すことも可能である・・・。パラメータは、このように構造体にまとめる・・・。 ここでは、THREAD_ARG構造体を定…

pthread_create

pthread_createは、スレッドを生成するライブラリ関数・・・。Man page of PTHREAD_CREATE重たい処理をさせたい時に、メインのスレッドとは別に、ワーカースレッドを作って、そこで処理させることで、メインスレッドの処理とワーカースレッドの処理を並行し…

wait

waitは、プロセスの終了などの状態変化を待つUNIXシステムコール・・・。Man page of WAITforkで生成した子プロセスが終了するまで、親プロセスは処理を待つようにしてみる・・・。statusに子プロセスの終了に関する情報が格納される・・・。自身が子プロセ…

fork

forkは、プロセスを複製して、新たなプロセスとして実行するUNIXシステムコール・・・。Man page of FORKforkが呼ばれるとプロセスが2つになるわけだが、戻り値はそれぞれ違い、それぞれのforkの戻り値で自分が親プロセスか子プロセスかがわかる・・・。まず…

system

systemは、指定の実行ファイルを実行するライブラリ関数・・・。Man page of SYSTEMsystemはexecファミリーと違って、プロセスの置換は行わず、新たにプロセスを作成して実行する・・・。system_main.cは、getpidでプロセスIDを取得し、60秒休止・・・。 そ…

execl

execlは、実行されているプロセスを指定の実行ファイルを実行してそのプロセスに置き換えるライブラリ関数・・・。Man page of EXECexeclを含むこれらはexecファミリーと呼ばれる・・・。execl_mainからexeclでexecl_subを実行し、execl_mainのプロセスはexe…

getpid

getpidは、自信のプロセスIDを取得するUNIXシステムコール・・・。Man page of GETPIDプロセスIDが判明した後、60秒間sleepで休止するので、その間にpsコマンドでプロセスIDを調べて同じかどうか・・・。これを実行すると、 $ ./getpid pid = 20514プロセスI…

sleep

sleepは、指定の秒数だけスレッドを休止するライブラリ関数Man page of SLEEPこれで5秒間スレッドを休止する・・・。ctimeで開始時刻文字列を取得し、出力・・・。 sleepで5秒休止したら、 ctimeで終了時刻文字列を取得し、出力・・・。 $ ./sleep sleep sta…

poll

pollは、複数のファイルディスクリプタを監視するUNIXシステムコール・・・。Man page of POLLselect同様に、複数のファイルディスクリプタを監視して、マルチセッションできるようにするわけだが、こちらの場合はpollfd構造体の配列を使う・・・。このよう…

select

selectは、複数のファイルディスクリプタを監視し、なんらかの状態変化が発生した場合に、この関数を抜けることで知らせるUNIXシステムコール・・・。Man page of SELECTこれで、最大5つのクライアントを同時接続できるサーバをつくる・・・。クライアントは…

共有ライブラリ

共有ライブラリは、実行時に動的にリンクできるライブラリで、呼び出す関数の形式が変わらなければ、リンクせずに共有ライブラリを差し替えるだけで関数内の動作を変えることができる・・・。とあるエンジニアの備忘log: Shared Object 入門2つの共有ライブ…

スタティックライブラリ

いくつか作った自作の関数をひとまとめのファイルに固めたものをライブラリという・・・。静的ライブラリを作る - voidy21の日記ライブラリには、スタティックライブラリと共有ライブラリがあるが、 今回はリンクすることで実行ファイルから使えるようにする…