2008/11/30

CPUID

【命令】
[引数]
EAX:

[返値]
EAX, EBX, ECX, EDX:


引数の値によって取得できるCPU情報が変わる.
詳しくはintel manual vol.2AのCPUIDの項を参照.


【補足】
linuxではCPUIDから抽出した情報を出力するcpuinfoがある.
# cat /proc/cpuinfo


【例】
unsigned int a, b, c, d;
asm volatile ("cpuid" : "=a"(a), "=b"(b), "=c"(c), "=d"(d) : "a"(0));


【参考資料】
Intel® 64 and IA-32 Architectures Software Developer's Manuals
sandpile.org -- IA-32 architecture -- CPUID
LHR-proc-cpuinfo - SyncHack
/proc/cpuinfoの中身 [備忘録]
CPUID - Wikipedia

2008/11/29

dbench

[Install]
dbenchのオフィシャルサイト
http://samba.org/ftp/tridge/dbench/
http://samba.org/ftp/tridge/dbench/dbench-4.0.tar.gz

からソースを持ってくる.

# ./autogen.sh
# ./configure
# make
# make install

[ドメインUでのインストール]
# yum groupinstall development-tools -y
popt.hが足りない.と怒られたので
# yum install popt-devel -y

[How to use]
# dbench [Number of Processes]

[Reference]
つれづれ ベンチマークツールdbenchを使用したディスク性能の評価

sysbench

sysbenchはCPU,  file IO, Memory, OLTPをテストできる包括的なベンチマーク.

// Install
sysbenchのソースを下記URLから取得する.
http://sourceforge.net/projects/sysbench/

解凍してできた sysbench-[version] ディレクトリ中で次のコマンドを実行する.

このとき,mysqlを使わない(OLTPベンチを使わない)場合は"--without-mysql"オプションを付ける.


# ./configure

コンパイル,インストール
# make
# make install


// How to use
# sysbench [common-options] --test=name [test-options] command
各項目の詳細は下記

[common-options]
全テスト共通のオプションの指定.
--num-threads: The total number of worker threads to create (default=1)
--max-requests: Limit for total number of requests. 0 means unlimited (default=10000)
--max-time: Limit for total execution time in seconds. 0 (default) means unlimited

[--test]
ベンチマークする項目の選択,下記の4種類を指定できる.
cpu
memory
fileio
oltp

[test-options]
各ベンチマーク項目専用のオプション.
・memory
--memory-total-size: Total size of data to transfer(default = 100G)

・fileio
--file-test-mode={seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}

[command]
prepare(fileio, oltpのみ): ベンチマークの準備(テスト用ファイルの作成等)
run: ベンチマークの実行
clean(fileio, oltpのみ): prepareで生成されたファイルの削除


// Reference
SysBench manual
MySQL-ベンチマーク

2008/11/27

シェルスクリプトの基本

シェルスクリプトの実行
シェルスクリプトを実行する際には,下記のようにシェルを指定して実行する(例ではbashを指定).
$ bash [script file]

スクリプトファイルの先頭の行に
#!/bin/bash

を記述することでシェルを指定することができる.


シェルスクリプトに実行権限を与えるには,下記のコマンドを実行する.
$ chmod u+x [script file]

実行権限を与えたシェルスクリプトファイルは下記コマンドで実行できる(ファイルはカレントディレクトリにあるものとする).

$ ./[script file]



シェルスクリプト中の変数
シェルスクリプト内での変数宣言は下記のように型を指定しない.
var=xxx
このとき,代入の前後にスペースを入れてはいけない.

変数をスクリプト内で使用するには変数名の前に'$'を付ける.
(example)
var=1
echo $var


引数の利用
シェル実行時の引数をスクリプト内で利用するには $n を使う.
$0: スクリプト名
$i: i番目の引数

(example)
引数で指定した名前のディレクトリを生成し,生成したディレクトリをカレントディレクトリとするシェルスクリプトを生成する.
test.sh を作成し,下記の内容を記述する.

#!/bin/bash
mkdir $1
cd $1

シェルスクリプトに実行権限を与える.
$ chmod u+x test.sh

シェルスクリプトを実行する.
$ ./test.sh hoge
ディレクトリhogeが作成され,hogeに移動する.


Reference
bashで始めるシェルスクリプト基礎の基礎

jiffies: タイマ割り込みカウンタ

jiffiesはカーネル内での時間経過の管理に使われる変数.
Linuxカーネルが起動してから,定期的に発生するタイマ割り込みが発生する度にインクリメントされる.

タイマ割り込みの頻度は、"HZ" として定数で定義されている.
linux 2.4カーネルでは100(10ms間隔でタイマ割り込みが発生)
linux 2.6カーネルでは1000(1ms間隔でタイマ割り込みが発生)
つまり,HZの値はタイマの精度を表していると言える.


// Reference
jiffies
路地裏 ソース解読研究所 時間は無限
Linux 2.6へ

2008/11/26

make

【makeコマンドオプション】
[install]
コンパイルしたファイルを任意のディレクトリにコピーする.

[oldconfig]
ディレクトリにある.configからデータを とって、それ以外の部分だけ聞いてくる.
他のディレクトリの.configをコピーしてから 上記を実行すると古い設定が有効になる.

[menuconfig]
コンフィグメニューを表示する.変更は.configに反映される.

[-j*]
マルチコアの場合は,このオプションを付けると,
ジョブが並列化されて,コンパイルが速くなる.
*はスレッド数を入れる.コア数と同じくらいの値がよさげ.


【カーネルコンパイルオプション】
[modules]
モジュールを作成する.

[modules_install]
作成されたモジュールを /lib/modules/[kernel version]内のサブディレクトリにコピーする.


【※捕捉 コンフィグ】
.configの各コンフィグメニューの設定の値の意味は下記の通り.
y: カーネルに静的に取り込む
m: カーネルモジュールとして設定する
n: 設定を無効化
?: Helpを見る


【参考資料】
Linux kernelの再構築
make の -j オプションの良値
Linux Module-HOWTO モジュールユーティリティ
Linuxでのカーネル再構築方法

マルチプロセッサー環境でKernelをビルドする

2008/11/25

Xenインストール(仮): ドメインUネットワーク設定

先輩によるとゲストUのネットワークが接続できなかった理由は
iptableが自分宛ではないパケットを廃棄しているために
ゲストUへのパケットをフォワーディングしてなかったっぽい.

[iptablesの状態表示]
# chkconfig --list | grep iptables

[ドメイン0とドメインUのiptablesをoffにする]
# chkconfig iptables off
# service iptables restart

※リスタートが失敗する場合は再起動

[その他]
当然ながらドメイン0のネットワークが正しく動いてないと,
ドメインUのネットワークも動かない.


【参考資料】
第3回 Xenによる仮想環境のネットワーク構築:ITpro

Xenoprof: Xenのパフォーマンスカウンタ

OProfile はカーネルも含めたシステム全体のプロファイリングを行うもの.
XenoprofはOProfileの拡張.

xenoprofを使うためには圧縮されていない,XenとLinuxのカーネルイメージが必要
(/boot/xen-syms-[version]とXenのコンパイルツリーのトップにあるvmlinux)

vmlinuxとvmlinuzは別物.
vmlinuzはvmlinuxを圧縮したもの?
展開の仕方は不明.

// OProfileを有効にする
# make menuconfig


Instrumentation Support --->
[*] Profiling support (EXPERIMENTAL)
OProfile system profiling (EXPERIMENTAL)

上記がチェックされていることを確認し,再コンパイル.

[opcontrol]
Active domains

--passive-domains
データを取るドメインUのIDを指定する.


[opreport]
opreport event:[EVENT]
指定したイベントのプロファイルのみ表示する.

opreport cpu:[number]
指定したCPUのプロファイルのみ表示する.


// Reference
[OProfile]
OProfileとは
Benchmark-OProfile - PukiWiki
Omicron OProfile
OProfileを使ってCPUプロファイリングをとる

OProfile documentation
OProfile manual

[xenoprof]
Opensource.hp.com - Welcome

[xenperf]
Linux Virtualization Guides - Xen 3.0 User Guide - Xen Build Options
Xen/Xen Tools/xenperf - PukiWiki

http://prdownloads.sourceforge.net/oprofile/oprofile-0.9.4.tar.gz

Linux Command: パスワードの変更

Linuxでログイン中のパスワードを変更するには下記コマンドを実行する.

$ passwd
(旧パスワードを1回,新パスワードを2回入力)

特権ユーザが任意のユーザのパスワードを変更するには下記コマンドを実行する.

# passwd USER_NAME

パスワードは
/etc/passwd
/etc/shadow
あたりに保存されている.


// Reference
passwd ユーザのパスワードを変更する - UNIXコマンド辞典:CodeZine(コードジン)
【 passwd 】 ユーザーのパスワードを変更する - Linuxコマンド集:ITpro

2008/11/24

起動ログ

起動時のログ(エラー含む)はだいたい

/var/log/

に出力される.(dmesgとか)

Linux: 上書き確認しないファイルコピー

デフォルトではcpコマンドは必ず上書き確認をしてくる.
これは,下記のようにエイリアスによってオプションが指定されているため.
alias cp='cp -i'
多数のファイルをまとめてコピーする際等に,上書き確認を抑制するには下記のようにcpコマンドを実行する.

$ /bin/cp (src) (dest)

[cpのオプション]
-a: コピー先で元のファイルの構成と属性を保持する
-r: 再帰的にコピーする
-v: コピーするファイル名を出力する
-i: 上書き確認する

[Reference]
Manpage of CP

2008/11/23

Linuxの警告音を無効化

pcspkr(ビープ音のドライバ)が無ければビープ音は鳴らなくなる.
一時的に無効化するには下記のコマンドを実行する.

# modprobe -r pcspkr

-r はモジュールの削除.

Linux起動時にpcspkrが読み込まれなくなるようにするには下記コマンドを実行する.

# echo blacklist pcspkr >> /etc/modprobe.d/blacklist


※追記
Fedoraではシステムメニューの
[設定] > [システム] > [ハードウェア] > [サウンド] > [ビープ音]
の"システムのビープ音を有効にする"のチェックを外すことでも無効化できる.


// Reference
Linuxでビープ音を無効にする

Xen: VMの管理コマンド

動作中のVM一覧の表示
# xm list

VMの設定ファイルに従ってドメインを作成
# xm create [VM設定ファイル]-c: 作ったVMのコンソールを起動

VMのシャットダウン(-eで全VM対象)# xm shutdown [ドメインID or ドメイン名]

VMの強制終了(-eで全VM対象)
# xm destroy

動作中のVMのコンソールを使う
# xm console [ドメインID or ドメイン名 or コンソール番号]
動作中のVMのVCPU一覧の表示
# xm vcpu-list

CPU Affinityを設定する
# xm vcpu-pin [ドメインID vcpu pcpu]指定ドメインのVCPUを,指定の物理CPUでのみ動作させる.
全てのCPUを指定するときは,"all"を指定する.
カンマで区切ることで複数のCPUを指定することもできる.

e.g.) domUのvcpu 0をpcpu 0 or 1で動かす
# xm vcpu-pin domU 0 0,1

e.g.) domUの全VCPUを任意の物理CPUで動かす
# xm vcpu-pin domU all all

VMに割り当てるメモリを変更する.
# xm mem-set ドメインID メモリ容量(MB)

ログの表示
# xm dmesg

【参考】
仮想化技術の大本命「Xen」を使ってみよう ~ Xen対応カスタムカーネル構築編 ~
第4回 動的に仮想マシンを移動し,可用性を向上:ITpro
xmコマンドのオプション
Manpage of DMESG
@IT:実践! Xenで実現するサーバ統合(1)
xm(1): Xen management user interface - Linux man page

2008/11/22

起動スクリプトの管理

chkconfigコマンドで起動スクリプトの管理を行う

【例】
[スクリプト一覧]
# chkconfig --list

[起動スクリプトのon/off]
# chkconfig [service] on/off


【参考】
chkconfigコマンド

2008/11/21

ファイル内の文字列の置換

# sed -i 's/検索文字列/置換文字列/g' 対象ファイル名
または
# perl -p -i -e 's/検索文字列/置換文字列/g' 対象ファイル名


【参考】
【 sed 】 文字列の置換,行の削除を行う
sed - ストリーミングエディタ
複数ファイル内の文字列を置換して上書き保存する

Linux: SELinuxの有効/無効化

SELinuxの有効/無効の設定変更は下記の手順で行う.

[SELinuxの状態確認]
# getenforce

Enforcing: 有効
Permissive: 無効

[SELinuxの有効/無効化]
# setenforce 0(無効化)/1(有効化)

[起動時のSELinuxの有効/無効化]
/etc/sysconfig/selinux
を変更する
SELINUX=enforcing
のenforcingをdisabledにすると無効化できる.

2008/11/19

Xenインストール2.5:ドメイン0ネットワーク設定

Xenのドメイン0が起動するようになったものの,
ドメイン0でネットワークに繋がらない状態になってしまいました.

先輩によると,原因はネットワークドライバが古かったことのようです.
intelから新しいドライバをダウンロード,インストールすることで解決した模様.
※追記:再インストールしてたらやり方がわかりました


[※補足:ネットワークインターフェースの型番を調べる方法]
ネットワーク設定ファイル
/etc/sysconfig/network-script/ifcfg-eth0
にネットワークコントローラの型番(今回は82566DM-2)が書いてある.
intelのドライバダウンロードページから型番検索で
対応するドライバ(e1000e-0.4.1.12.tar.gz)が見つかる.


[ドライバのインストール]
ドライバ解凍後にできるe1000e-0.4.1.12/srcで

# make

# make install

これだけだと"eth0が見つかりません"とかエラーメッセージが出る.
lsmodしてもネットワークドライバ(e1000e)が見つからない.
make installだけだとinsmodされないらしく,insmodしたらネットワークにつながった.
システム起動時にドライバを読み込むようにするには

/etc/modprobe.conf

を修正する必要がある.

alias eth0 e1000e

を追加すると起動時にドライバを読み込んでくれる.

※追記
# modprobe e1000e
で上記の操作をしてくれる?


[※ネットワーク設定ファイルの場所]
/etc/sysconfig/network-scripts/ifcfg-eth0


[ネットワークサービスのリスタートコマンド]
# service network restart

[起動スクリプトでネットワークがonになっているかを確認]
# chkconfig --list network

onになっていなければ

# chkconfig network on
[ネットワークインターフェースが認識されないとき]
# service network restart# xend restart

それでもだめなら再起動


[※追記]
カーネルを更新するとドライバもmakeとmake installし直す必要があるっぽい.


【参考】
Linux技術トレーニング 基本管理コース II 第1章 カーネル

2008/11/18

Linux Command: uname

unameコマンドはシステム情報を表示する.

[Example]
$ uname -r
2..18.8-xen

[Reference]
【 uname 】 システム情報の表示

Linuxでのネットワーク設定の確認

現在のネットワーク設定を表示する.
Windowsではipconfigコマンドを使うが,Linuxではifconfigコマンドを使う.

# ifconfig -a

はWindowsのipconfig /allにあたる.

2008/11/16

RPM関連コマンド

[インストールされているRPMパッケージを探す]
# rpm -qa | grep [package]

[RPMパッケージの情報を表示する]
# rpm -qi [package]

[インストール]
# rpm -ivh [package]

[アンインストール]
# rpm -e [package]
--nodepsオプションを付けると依存関係のチェックをしないで強制的にアンインストールする.

[RPMファイルをcpioファイルに変換]
# rpm2cpio [package]

RPMファイルに含まれるファイルの一覧表示
# rpm2cpio [package] | cpio --list

RPMファイルに含まれるファイルの展開
# rpm2cpio [package] | cpio --id


【参考】
RPMパッケージをインストール/アンインストールするには
RPMパッケージの情報を調べるには
RPMパッケージからファイルを取り出すには
RPM コマンドの使い方

システム起動時にマウントされるデバイスの設定

システム起動時にマウントされるデバイスは、/etc/fstabで設定されている.

【参考】
/etc/fstabに記述されている数字の意味

depmod

カーネルモジュールの依存リスト(modules.dep)とマップファイルを作成する.

# depmod [version]

を実行すると /lib/modules/[version] 以下のモジュールの依存リストを
/lib/modules/[version]
に作成する.


// Example
初期RAMディスク(initrd)の生成のためにカーネルモジュール依存リストを利用する.
下記のコマンド例では,depmodコマンドで2.6.18.8-xen カーネルのモジュール依存リストを作成している.


# depmod 2.6.18.8-xen


依存リストを利用するコマンドとしてmkinitrdがある.
下記コマンド例では,上記コマンドで作成したモジュール依存関係を元に,

 /boot 以下に起動ディスクのイメージファイル(.img)を生成する.



# mkinitrd /boot/initrd-2.6.18.8-xen.img 2.6.18.8-xen


// Reference
Manpage of depmod
Linuxカーネルの基本機能 第17回 モジュール機構:ITpro

Linux: ブートローダー

ブートローダの役目は大きく2つ.
・システム電源投入後,HDD上などのファイルシステムに 保存されているカーネルをメモリに読み込むこと
・読み込まれたカーネルにオプションを指定してCPUに実行させること

x86向けパッケージでのFedoraのデフォルトのブートローダーはGRUB(GRand Unified Bootloader).

カーネル起動に関する設定ファイルは
/boot/grub/gurb.conf
/etc/grub.conf/boot
/grub/menu.lst
等複数あるが,ディストリビューションによってファイルの有無が異なるため
/boot/grub/menu.lst
を編集するのが無難.menu.lstは大体どのディストリビューションにもあるらしい.


【設定ファイルの共通設定】
timeout: 起動時のOS選択メニューまでの時間(秒単位)
default: デフォルトで起動するOS(titleの順番に0,1,2…)
hiddenmenu: 入れるとtimeoutで設定した期間後にdefaultで設定したOSが起動する
splashimage: ブートの起動画面の背景画像


【各行先頭の予約語】
title: GRUBのブートメニューで表示される名前
root: (デバイス名,パーティション位置)
kernel: 読み込むカーネルモジュールのパス(/bootからの相対パス)
initrd: 読み込むRAMディスクのパス(/bootからの相対パス)


【オプション】
ro: read only
root: ルートのマウントブロックデバイス
console: コンソールサイズ
rhgb: redhat graphical boot
quiet: 全ての詳細なカーネルメッセージがブート時に抑制されていることを示す


【tips】
"vmlinuz"から始まる名前のファイルはカーネル本体のファイル.
"initrd"から始まる名前のファイルは初期RAMディスクファイル.


【例】


【参考】
GRUBのインストール、基本設定
ブートローダ/カーネル起動/初期ラムディスク展開の比較
GRUB の rhgb quiet って何?

2008/11/14

ちょっと気になる英単語

英語の論文や資料を読んでいるときに
気になった英語の表現・単語などをメモ!

[単語]
tarball: tarファイルそのもの、またはそれを圧縮したものを指す

[熟語]
state of the art: 最先端の
break down: 分類する,分析する

Larrabeeアーキテクチャ

メニーコアになると演算速度よりも,バスの帯域がボトルネックになるそうな.
確かにコア数が増えるほど,コア同士の通信も増えるので納得.

メモリ帯域をセーブするLarrabeeアーキテクチャ

Intel CPU: ターボモード

マルチコアCPUで,あるコアがアイドル状態 or 稼働率が低いとき
チップ全体のTDPで考えると,他のコアに余裕ができる.
TDP的に余裕があるため,アクティブな他のコアをオーバークロックすることができる.
ハードウェアを変更することなく,コアの性能を
最大20%近く引き上げることができるため,注目されている技術だそうな.

[Reference]
Nehalemの性能を引き上げる切り札「ターボモード」

LDAP

Lightweight Directory Access Protocolの略で
ディレクトリデータベースへアクセスするためのプロトコル.
ディレクトリサービスとは、ネットワークを利用する
ユーザ名やマシン名などの様々な情報を管理するためのサービスのこと.

[Reference]
LDAPとは何をするもの?

2008/11/13

Linux Command: initrd

mkinitrdコマンドはinitrdイメージを作成するためのコマンド.

[書式]
mkinitrd [作成されるイメージ] [バージョン]
-v: イメージファイル作成の経過を表示
-f: 既存のイメージファイルの上書き許可
--with: 初期RAMディスクに含めるモジュール?

[例]
# mkinitrd -v -f --with=aacraid --with=sd_mod --with=scsi_mod initrd-2.6.18-xen.img 2.6.18
xenaacraid: sataのモジュール,RAID用?
scsi_mod: scsi機器を使用するためのモジュール
sd_mod: scsiのディスクサポートモジュール


【initrd】
Linuxが起動する際に一時的に利用されるファイルシステムのイメージ.


【参考】
initrd

2008/11/12

Xenインストール2:ドメイン0構築

Xenのインストール.
dom0を構築して起動するまで.


// 初期RAMディスクの作成
depmodで作成したカーネルモジュールの依存関係リストからmkinitrdで,起動用の初期RAMディスクを作成する.

# depmod 2.6.18.8-xen
# mkinitrd -v -f --with=aacraid --with=sd_mod --with=scsi_mod /boot/initrd-2.6.18.8-xen.img 2.6.18.8-xen

モジュールが足りていないためにmkinitrdが失敗する場合はLinuxカーネルからモジュールをコピーする.今回は
/lib/modules/2.6.xxx/kernel/drivers/
から
ata, message, scsi, usb
下にあるモジュールを
/lib/modules/2.6.xx-xen0/kernel/drivers/
にコピーした.

[設定確認(PAEが有効時のみ)]
menuconfigで
Processor type and features -> High Memory Support (4GB) ->
( ) off
( ) 4GB
(X) 64GB

になっていることを確認.


// パッケージ更新
Xenのデーモン(xend等)はpythonで書かれているので,
pythonをインストール/アップデートしておく.


// ブートローダの設定
/boot/grub/menu.lst
に下記を追加してXenを起動するようにする.
menu.lst は grub.conf へのシンボリックリンクになっている.

title Xen 3.3 / XenLinux 2.6.18.8
root (hd0,0)
kernel /xen.gz console=vga
module /vmlinuz-2.6.18.8-xen ro root=/dev/VolGroup00/LogVol00 rhgb console=tty0
module /initrd-2.6.18.8-xen.img

※rootのパスは環境により異なる.この場合はLVMを使っている. /etc/fstab を見ればルートのパスが書いてある.カーネルモジュールの場所が通常のカーネルと同じならroot指定をコピペすればおっけー.XenのREADME通りにパスを設定すると動かないので要注意.
※カーネル,モジュールの指定はパーティションの定義によって異なる./boot が定義されていれば/boot からのパスを書くが,定義されていない場合は /boot を含む絶対パスを書く.
/boot が定義されているかは menu.lst のコメントを見ればわかる.

[捕捉]
FDDが無いときBIOSで有効になっていると,ゲストOS起動中に下記のエラーが出て起動に時間がかかる.
end_request: I/O error, dev fd0, sector 0
よって,FDDが無い場合はBIOSでFDDを無効にしておいた方が良い.



ここで一旦再起動する.



// Xenツール
xenが起動してdom0が立ち上がったものの,xendが起動できない.

下記コマンドを実行してからXenツールをリビルドするとうまくいくよ.
という記事を発見したので早速やってみる.


$ rm -fr /usr/lib/python/xen/
$ rm -fr /usr/lib/python2.5/site-packages/xen/

$ cd [Xenソースを展開したディレクトリ]/xen-[version]/tools
$ make
$ make install


// xendの起動・設定
# xend start
# xm list
# chkconfig xend on

ドメインのリストが出た!!
というわけで,無事にdom0とxendが動きました.めでたしめでたし.
次はdomUを作成して動かします.


// Reference
xen-3.2のインストール手順
Xen3.0環境構築中のエラー
Xen環境作成メモ(その2)

yumの使い方

パッケージのインストール
# yum install (package)

パッケージの検索
# yum search (package)

インストール済みのパッケージのアップデート
# yum update (package)

パッケージのアンインストール
# yum remove (package)

インストール済みパッケージの一覧
# yum list installed

古いカーネルを削除する
# yum install yum-utils
# package-cleanup --oldkernels

[Reference]
@IT:yumコマンドでよく利用するコマンド
古いカーネルを削除するには - @IT

エラーのリダイレクト

端末に色々表示されるとエラーだけ表示したいときもあります.
そんな時はこれ!

[command] 2> [output file name]

リダイレクトの前の'2'が標準エラー出力をリダイレクトする.
ということを示している.

Linux端末の設定変更

Fedora 9のGNOME端末の設定を変更する方法.

スクロール行数の設定変更をしてみる.
[端末のメニュー] > [編集] > [現在のプロファイル] > [スクロール]
から[スクロールバックのサイズ]を増やせばオッケー.

サイズを増やすとメモリを食うみたいなので,サイズは適宜変更しましょう.

2008/11/04

Windows CEにおける文字コード

Windows CEでのプログラミング中に文字コードの扱いに苦労したのでメモメモ.

Windows CEではunicodeのみしかサポートされていないためCE上でchar型の引数を取る関数(printfとかstrcpy等)を実行すると強制終了する.
よって,char型の代わりにTCHAR型(もしくはwchar)を使う必要がある.
tchar.hにTCHAR型におけるprintfやstrcpyに対応する関数が定義されているので,こちらを使いましょう.

[tcharの対応表]http://palepoli.skr.jp/content/cpp/tchar.php

ちなみにchar型を引数にとっても大丈夫な関数もある,socket関数とか.
あと,データを格納する変数としてchar型を利用するのはセーフなもよう.

char型とTCHAR型の文字列を相互変換する関数を以下に示す.

[char to TCHAR]
MultiByteToWideChar( CP_ACP, // ANSI コードページ
MB_PRECOMPOSED, // 規定の方法
str, // 変換する文字列
-1, // 変換文字列の長さを自動計算
tbuf, // 変換後のバッファ(ワイド文字)
BUFFER_SIZE // バッファサイズ(ワイド文字数単位)
);


[TCHAR to char]
WideCharToMultiByte(
CP_ACP, // 変換に使うコードページ
0, // マッピング方法,0以外だと失敗した
str, // 変換する文字列(ワイド文字)
-1, // 変換文字列の長さを自動計算
cbuf, // 変換後のバッファ
BUFFER_SIZE, // バッファサイズ(ANSI文字数単位)
NULL, // マップできない文字の既定値のアドレス
NULL // 既定の文字を使ったときにセットするフラグのアドレス
);