03
1月
2007

C言語

C言語をやってみよう,ふと思い立った.かなり久しぶりだ.大学当時Cは講義であった.学生時代怠けまくった結果(?)私はCよりも,趣味でやっていたJavaの方が書いたコードの行数は多い.だが,やはり「たしなみ」としてC言語はやっておかねばなるまい.
基本(?)ライブラリ編
プロセス制御
シグナル
パイプ
IPC
Pthread
Socket
端末制御
curses
CUnit
OpenSSLを使用したCプログラミング
その他

基本(?)ライブラリ編

とりあえず,ライブラリにある関数をいろいろ試してみる.もちろん(?)Debian環境で.

ファイル操作
2003-07-20T15:13+09:00 matsu
GNU/Linuxシステムでのファイル操作について.ここでは特にシステムコールを用いてファイル操作する方法について.
標準入出力ライブラリでのファイル操作
2003-07-20T15:13+09:00 matsu
標準入出力ライブラリを使用するとファイル操作がしやすく,バッファリングなども効くので便利である.
標準入出力ライブラリによるファイル操作 その2
2003-07-20T15:13+09:00 matsu
標準入出力ライブラリによるファイル操作についてもっと.
書式付き入出力とストリームエラー
2003-07-20T15:13+09:00 matsu
printf族とscanf族による書式付き入出力と,入出力時のエラーについて.
コマンドライン引数の取得とgetopt
2003-07-20T15:13+09:00 matsu
コマンドライン引数を取得する方法と,それを簡単に行なうライブラリ関数getoptについて.
コマンドライン引数の取得 その2
2003-07-20T15:13+09:00 matsu
関数getopt_longは長い形式のオプションの取得に便利な関数である.これはGNU拡張らしい.長いオプションは大抵–で始まる.
環境変数
2003-07-20T15:13+09:00 matsu
HOMEやUSERなど,環境変数に応じた処理をしたくなることもあろう.なので,環境変数を取得したり設定したりできると嬉しい.
日付と時刻
2003-07-20T15:13+09:00 matsu
プログラムによっては日付や時刻を取得する必要がある.コンピュータで日付や時刻を操作する場合は,「エポックの起点」からの経過秒(もしくはミリ秒)をもとに行うことが多いようだ(もちろんlocaleも考慮する).「エポックの起点」はシステムによるが,UNIXではGMT 1970年1月1日0時らしい.epochを辞書で引いてみたら,「ある特徴のある時代」らしい.ネットで調べると,「基準時刻」と訳してあったりする.こちらの方がわかりやすいだろうか.
ユーザ情報
2003-07-20T15:13+09:00 matsu
ユーザ情報というと,アカウント名,uid,gidなどである.これらの情報が実際のプログラミングでどう使用されるのかは,ちょっとわからないが,取得できないよりはできるほうがいい.
ホスト情報
2003-07-20T15:13+09:00 matsu
プログラムを実行しているマシンの各種情報の取得の仕方.
ロギング
2003-07-20T15:13+09:00 matsu
syslog関数によるロギングについて
リソース情報の取得と設定
2003-07-20T15:13+09:00 matsu
プログラムを実行する際のリソース情報(とくにリソースの制限)を取得する必要がある場合がある.
マイクロ秒の取得とナノ秒でのスリープ
2007-05-13T13:50+09:00 matsu
time関数やsleep関数は秒単位でしか処理できないが,ミリ秒とかマイクロ秒とか,より高精度な処理をしたいときのための関数,gettimeofdayとnanosleepを試してみた
プロセス制御
プロセスがプロセスを生んで殺してまた生んで…..そして死ぬ.
関数system
2003-07-20T15:13+09:00 matsu
関数systemによる,もっとも簡単なプロセスからプロセスを生む方法.
execによるプロセス生成
2003-07-20T15:13+09:00 matsu
実行中のプロセスを新しいプロセスで置き換える.したがって新しいプロセスのPIDやniceなどはexecを実行したプロセスと同じである.あと,ファイルディスクリプタなどもexec元がオープンしていれば,新しいプロセスでもオープンされている.ディレクトリストリームはクローズされるらしい.execではshell経由での起動ではないので,shellの展開機能は使用できないが,shell起動のオーバーヘッドはない.
forkとwaitとゾンビプロセス
2003-07-20T15:13+09:00 matsu
forkはプロセスのコピーを作成する.そしてwaitで待つ.処理の流れが一本から複数に分かれる様がフォークみたいだからforkなのだろうか.
シグナル
シグナルを使うとイベント駆動でいろいろできる.
シグナルをキャッチしてみる
2003-07-20T15:13+09:00 matsu
まずは基本.BASHでいうとtrapになるだろうか.
シグナルを送信してみる
2003-07-20T15:13+09:00 matsu
受信の方法がわかったところで今度は送信してみる.シグナルの送信には,raiseとkillがある.raiseは自分自身にシグナルを送信する関数である.killはコマンドkillと同等の機能をもつ関数である.
sigaction
2003-07-20T15:13+09:00 matsu
sigaction関数はsignal関数よりもより細かい制御ができる.sigactionはX/Open仕様ではsignalよりも信頼できるとして推奨しているらしい.
パイプ
人は一日何回コマンドラインでパイプを使用するのだろうか.ここではCでパイプを使用する方法について記述する.
popenとpclose
2003-07-20T15:13+09:00 matsu
パイプのopenとclose.
pipe
2003-07-20T15:13+09:00 matsu
popenとpcloseがsystem関数のパイプ版だと考えると,pipeはexecのpipe版と考えられるだろうか.
fifo
2003-07-20T15:13+09:00 matsu
FIFOは名前付きパイプらしい.パイプがファイルで嬉しくなる.
IPC
IPCはInterProcess Communicationの略でSystem V IPCと呼ばれ,SVR2で導入されたらしい(man 5 ipc参照).なんかipc()というハッカー向けの関数(システムコール)もあるようだ(man 2 ipc参照).で,IPCではシグナルやパイプに代わるプロセス間通信の方法として以下についての機能を提供している.
セマフォ
共有メモリ
メッセージキュー
これらのリソースの状況を調べたり消したりするコマンドとして,ipcsとipcrmがある.これらはipcプログラミングでのデバッグでも重宝する.
セマフォ
2003-07-20T15:13+09:00 matsu
共有メモリの話題に入る前の準備としてセマフォについて記述する.
共有メモリ
2003-07-20T15:13+09:00 matsu
共有メモリもセマフォと同じ雰囲気で取得,設定,操作する.
メッセージキュー
2003-07-20T15:13+09:00 matsu
メッセージキューはパイプとより扱いが簡単でちょっと嬉しい.
Pthread
Pthreadを使用してマルチスレッドプログラミングをしてみた.
スレッドの生成
2007-02-05T00:00+09:00 matsu
まずはスレッドを生成してみる.
スレッドのデタッチとjoin
2007-02-05T22:50+09:00 matsu
スレッドのデタッチと合流について調べてみた.
スレッド属性
2007-02-12T15:50+09:00 matsu
スレッド属性について調べてみた.
ロックとmutex
2007-02-20T23:00+09:00 matsu
スレッドの同期には,pthread_joinによる合流の他に,ロックという方法がある.
より高度な同期
2007-10-27T14:00+09:00 matsu
ロックで基本的な同期は実現できるが,限界がある.より高度な表現でより高度な同期を実現するための関数があるようなので,試してみた.
Socket
マシンがネットワークにつながってないと寂しくて不安なので,つなげたい.
socket関数とプロトコル
2003-07-20T15:13+09:00 matsu
まずsocket関数とプロトコルとアドレスについて記述しておく.
PF_UNIX
2003-07-20T15:13+09:00 matsu
PF_UNIXでソケット通信してみる.
ネットワーク情報
2003-07-20T15:13+09:00 matsu
PF_INETの前にネットワーク情報について記述してみる.
PF_INET
2003-07-20T15:13+09:00 matsu
PF_INET,SOCK_DGRAMでソケット通信してみる.
select
2003-07-20T15:13+09:00 matsu
selectを使用して複数のファイルディスクリプタからの入出力を制御
端末制御
端末を制御してUIを良い感じにしたいときもあろう.
CRを何とかしたい
2003-07-20T15:13+09:00 matsu
処理によっては普通にgetcharするとCRを読み込んじゃって困ることがあるかもしれない.
リダイレクトされているかどうか知りたい
2003-07-20T15:13+09:00 matsu
出力がリダイレクトされているかどうかを調べる.これはファイルディスクリプタをチェックすればわかる.
termios
2003-07-20T15:13+09:00 matsu
termiosは「非同期通信ポートを制御するための汎用ターミナルインタフェース」らしい.端末をclearしたりechoを抑制したり非カノニカルモードにしたりできる.
terminfo
2003-07-20T15:13+09:00 matsu
terminfoを使用すると出力場所とかをイイ感じにできるかもしれない.
curses
cursesはviやカーネルのmake menuconfigなどで使用されている,アレ(どれ?)である.CUIで画面制御したいときに使用する.
とりあえずウィンドウを出してみる
2003-07-20T15:13+09:00 matsu
何はともあれウィンドウを出してみる.
cursesの基本的な関数
2003-07-20T15:13+09:00 matsu
cursesの多くの関数のうち,基本的なものを紹介する.
出力文字の属性
2003-07-20T15:13+09:00 matsu
出力文字には強調表示やアンダーラインなどの属性を付加することができる.
キーボード入力
2003-07-20T15:13+09:00 matsu
termiosやterminfoでやったことと同様のキーボード入力制御ができる.
マルチウィンドウ
2003-07-20T15:13+09:00 matsu
cursesでは複数のウィンドウを作成,操作できる.あとサブウィンドウも作成,操作できる.
エスケープシーケンス
2003-07-20T15:13+09:00 matsu
多くの端末では,ESCキーや矢印キーなどを押すとエスケープシーケンスが送信される.これを処理してみる.
スクロール
2003-07-20T15:13+09:00 matsu
cursesでは画面をスクロールさせたりもできる.
パッド
2003-07-20T15:13+09:00 matsu
ウィンドウは物理画面や親ウィンドウの範囲内に収まっていなければならない.パッドとはそのような制約なしに自由な大きさで作成できる論理画面である.
マウス
2003-07-20T15:13+09:00 matsu
ncursesではマウスの操作を検知できるらしい.ただしSVr4以前とか4.4BSD以前ではできないようだ.
CUnit
CUnitはCプログラムのためのテスティングフレームワークであり,ユニットテストに便利そうなので試してみた.
はじめに
2006-12-05T09:10+09:00 matsu
CUnitはLGPLなC言語プログラムのためのテスティングフレームワークらしい.
クィックスタート
2006-12-08T08:45+09:00 matsu
CUnitでのテストの作成から実行,レポートの閲覧まで,ざっと試してみた
初期化関数とクリーンアップ関数
2006-12-29T09:30+09:00 matsu
CUnitではテストスィートを実行する前の初期化関数とクリーンアップ関数が登録できるようなので,試してみた.
OpenSSLを使用したCプログラミング
OpenSSLを使用するとセキュアな通信ができたり,証明書を作ったり署名したりできるようだが,その足回りとして暗号化関数などがあるようなので,その辺から始めて,SSL通信までざっと試してみたい.
OpenSSLで3DESしてみる
2007-05-02T14:30+09:00 matsu
OpenSSLにはDES暗号化する関数が提供されている.これにはいろいろなバリエーションがあるようだが,良くわからないので,とりあえずメジャーそうな3DESを試してみる.
OpenSSLでRSAを試してみる
2007-05-03T21:30+09:00 matsu
OpenSSLにはRSAのキーペアを作成し,これを使用して暗号化,復号する機能や,キーをPEM形式で入出力する機能があるのでためしてみた.
BIOとBase64
2007-05-23T00:15+09:00 matsu
BIOはOpenSSLにおけるフレームワークにおける抽象データ型で,暗号化や符号化,ファイルやネットワークといった入出力の詳細をアプリケーションから隠蔽する.で,このフレームワークのもとで実装されているBase64コーデックを試してみた.
その他
C言語に関してのその他のトピックを記述してみる.
GNU Readlineを使ってみる
2006-11-11T13:45+09:00 matsu
GNU RreadlineはCUIに劇的な利便性をもたらす偉大なライブラリでありながら,これを使用するプログラムを作成したことがないので,作成してみた.
libsafeを使ってみる
2007-04-17T20:50+09:00 matsu
libsafeはCの標準関数のうち,よくバッファオーバーフローを起こすものを差し替えてバッファサイズをチェックする処理をしてくれるらしいので試してみた.
zlibを使ってみる
2007-04-21T13:00+09:00 matsu
自作のアプリケーションでデータを圧縮解凍したいと思うことがたまにある.zlibを使用すると簡単にzip圧縮と解凍ができるようなので試してみた.
bzlibでbz2ファイルを読み書きしてみる
2007-04-30T13:00+09:00 matsu
bz2はメモリを喰うがzlibより圧縮効率がよいらしいので,そのライブラリbzlibを試してみた.

You may also like...