読者です 読者をやめる 読者になる 読者になる

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の日記ライブラリには、スタティックライブラリと共有ライブラリがあるが、 今回はリンクすることで実行ファイルから使えるようにする…

connect

connectは、指定のアドレスのサーバに接続するUNIXシステムコール・・・。Man page of CONNECTこれまでtelnetでサーバに接続してきたが、今回はクライアントを作り、connectでサーバに接続して通信をする・・・。サーバは、"end"が送られてくるまで、クライ…

gethostbyname

gethostbynameは、指定されたホスト名のホストコンピュータ情報を取得するライブラリ関数・・・。Man page of GETHOSTBYNAMEホスト名を指定すると、ホスト情報を格納するhostent構造体のポインタを返す・・・。gethostbynameでホスト名からホスト情報を取得…

send

sendは、アクセプトした相手のソケットにバイトデータを書き込むことで送信するUNIXシステムコール・・・。Man page of SEND前回は、相手から送られたきた文字列をサーバの標準出力に出力するだけだったが、 今回は、その文字列をsendを使って相手に送り返す…

recv

recvは、アクセプトした相手から送られてきたバイトデータを読み込むUNIXシステムコール・・・。Man page of RECVアクセプトした相手のソケットファイルディスクリプタから、指定のバッファに、指定のサイズ分読み込む・・・。今回は"end"が送られてくるまで…

accept

acceptは接続してきた相手のソケットを受け付けるUNIXシステムコール・・・。Man page of ACCEPTlistenでリッスンした後にこれを呼ぶと、相手が接続する(アクセプト)まで次の処理にいかない(ブロッキング)・・・。相手が接続してきたら、引数のaddrに相手のI…

ntohs

ntohsは、ネットワークバイト―ダからホストバイトオ―ダに変換するライブラリ関数・・・。Man page of BYTEORDERhtonsでネットワークバイトオ―ダに変換したポート番号をホストバイトオ―ダに戻す時などに使う・・・。これで戻してみる・・・。ネットワークバイ…

inet_ntoa

inet_ntoaは、in_addr構造体のIPアドレスをIPアドレス文字列に変換するライブラリ関数・・・。Man page of INETinet_atonで、変換した後のin_addr構造体addrを元の文字列に戻す・・・。in_addr構造体のaddrとIPアドレス文字列を指すchar *ポインタip_addr_st…

inet_aton

inet_atonは、IPアドレス文字列をネットワークバイトオーダのバイナリ値に変換するライブラリ関数・・・。Man page of INETIPアドレス1.2.3.4を変換する・・・。in_addr構造体変数addrを用意・・・。inet_atonで"1.2.3.4"をネットワークバイトオーダ(ビッグ…

listen

listenは、通信する相手からの接続の待ち受けを開始するUNIXシステムコール・・・。Man page of LISTENバインドしたソケットをこれに渡すことで、相手からの接続を待ち受ける・・・。 接続は1つずつ受付処理されるので、2番目以降は保留となり待ち行列を形成…

setsockopt

setsockoptは、ソケットのオプション設定をするUNIXシステムコール・・・。Man page of GETSOCKOPTよく使うオプションとしては、SO_REUSEADDRが挙げられる・・・。サーバプログラムで、同じポート番号でbindを繰り返すと、"Address already in use"が出て、…

bind

bindは、作成したソケットのソケットファイルディスクリプタと、自身のIPアドレスやポート番号などの情報を紐付けるUNIXシステムコール・・・。Man page of BINDsocketでソケットを作成はしたものの、自分のIPや使用するポートがわからなければ通信できない…

htons

htonsは、ホストバイトオーダからネットワークバイトオーダに変換するライブラリ関数・・・。Man page of BYTEORDER作成したソケットには、自分のIPやポート番号などを紐付けるバインドという作業が必要・・・。 ホストコンピュータ(Intel x86搭載機など)で…

socket

socketは、通信をするために必要なソケットを作成するUNIXシステムコール・・・。Man page of SOCKETざっくり言うと、インターネットなど他のコンピュータとの通信は、ソケットを作成し相手先に接続をした上で、ソケットへの書き込みや読み込みを通じたデー…

write

writeは、指定されたファイルディスクリプタに、指定されたバイナリデータを書き込むUNIXシステムコール・・・。Man page of WRITEreadと同様に、writeも使い分けを考える必要がある・・・。 writeとfwriteで比較してみる・・・。"ABCD"の4バイトデータをwri…

read

readは、指定されたファイルディスクリプタから、バイナリデータをバッファに読み込むUNIXシステムコール・・・。Man page of READfreadも最終的にはこのreadを呼ぶが、なぜfreadとreadを使い分けるのか・・・。 2パターンのバイナリデータをreadとfreadでそ…

open

openは、指定されたファイル名のファイルを開くUNIXシステムコール・・・。Man page of OPENこれまで、標準Cライブラリfopenでファイルを開いてきたが、これは高水準入出力関数であり、バッファリングなどの補助的な機能を有する・・・。 一方、システムコー…

clock

clockは、CPUがとある処理にかかった時間を計測するためのC標準ライブラリ関数・・・。Man page of CLOCKclock_tはプロセッサ時間単位なので、秒単位の結果を得るには、 開始と終了のclock_tの差をCLOCKS_PER_SECで割ればいい・・・。前回のループ処理(iを0…

difftime

difftimeは2つの時刻の差を求めるC標準ライブラリ関数・・・。Man page of DIFFTIME戻り値はdoubleで返る・・・。これを使って、とある処理にかかる時間を計測する・・・。 といっても、変数iを0から1000000になるまで足し合わせるだけだが・・・。開始時刻s…

mktime

mktimeは、ローカル時刻が格納されているtm構造体の時刻情報をUNIX時間へ変換し、time_t型変数として返すC標準ライブラリ関数・・・。Man page of CTIMEここまでで、time: time_tを取得 localtime: time_t -> tm構造体 asctime: tm構造体 -> 時刻文字列 strp…

strftime

strftimeは、tm構造体の時刻情報を指定のフォーマットに従って時刻文字列に変換し、指定のバッファに格納するC標準ライブラリ関数・・・。Man page of STRFTIMEstrptimeは、時刻文字列をパース -> tm構造体に格納なのに対し、strftimeは、tm構造体 -> 指定の…

strptime

strptimeは、指定された時刻文字列を指定されたフォーマットに従って解析(パース)し、指定されたtm構造体に時刻情報を格納するライブラリ関数・・・。 これはC標準ライブラリには含まれていない模様・・・。また、VisualC++などWindows環境でも使えない・・…

ctime

ctimeは、指定されたtime_t型変数のUNIX時間を直接ローカル時刻文字列に変換し、その文字列ポインタを返すC標準ライブラリ関数・・・。Man page of CTIMEこれまではlocaltimeでtm構造体への変換を経由していたが、これを使って直接ローカル時刻文字列を取得…

asctime

asctimeは、指定されたtm構造体の時刻情報を時刻文字列に変換し、その文字列ポインタを返すC標準ライブラリ関数・・・。Man page of CTIME前回までのように、printfにtm構造体の各要素を指定することなく、時刻文字列にできるので、これを使って時刻文字列を…

localtime

localtimeは、指定されたtime_t型変数のUNIX時間をローカル時刻に変換し、 時刻情報をtm構造体に格納するC標準ライブラリ関数・・・。Man page of CTIMEローカル時刻、つまり日本なら日本時間(JST)に変換できるので、これで日本の時刻文字列を表示する・・・…

gmtime

gmtimeは、指定されたtime_t型変数のUNIX時間をグリニッジ標準時の時刻に変換し、 時刻情報をtm構造体に格納するC標準ライブラリ関数・・・。 (これ自身はシステムコールではないが、timeシステムコールに関連するライブラリ関数なので、このカテゴリで扱う…

time

timeは、「UNIX時間」と呼ばれる時刻を表す数値を返すUNIXシステムコール、およびC標準ライブラリ関数・・・。Man page of TIMEUNIX時間は、UTC(協定世界時)における1970年1月1日0時0分0秒からの経過秒数であり、time_t型の数値として表わされる・・・。 tim…