差分表示


* RHLEを使ってみる
いろいろあって、cygwinに続き RedHat Linuxを使うことにした。~
もろもろ使えるようにしていく過程で躓いたw遍歴を。

** RHEL6の Extra Package
- https://fedoraproject.org/wiki/EPEL/ja

便利な時代になったのかな?

RHEL6向けに epel-release-6-x.noarch.rpmがあるので、適当な所から探して、
- rpm -ivh http://ftp.<どこか>/Linux/Fedora/epel/6/x86_64/epel-release-6-x.noarch.rpm

すれば yumの reposに入るので、その後は適当にyumすればいい。

** Fedora17
大分違う。違いすぎる。
- systemctl start vsftpd.service

** expect-5.43の make check
expect-5.43/testsuiteの Makefile.inが 2.63のautoconfにはなくなっているoptionを呼んでて、make checkができん。下記はどうでもいいdiff
---(
103c103
<       (cd $${srcdir}; autoconf --localdir=$${srcdir}/..)
---
>       (cd $${srcdir}; autoconf)
---)

**rdesktop
[[http://www.rdesktop.org>とても便利]]。特に書くこともない模様w

** linux-ntfs
LinuxでNTFSをmountしたいと言うことで、[[linux-NTFS project>http://www.linux-ntfs.org/doku.php]]のdrvを拾ってやることにした。二つの方法が提供されている。
-1. [[Kernel landのNTFSドライバ>http://www.linux-ntfs.org/doku.php?id=kernel_driver]]をいれる
-2. [[User landのNTFSドライバ>http://www.linux-ntfs.org/doku.php?id=ntfsmount]]をいれる
機能性を取るなら 2、速さを取るなら 1らしい。installする上で 1は kernel再構築がいりそうなので、めんどうだから 2にした。

[[@ITの解説>http://www.atmarkit.co.jp/flinux/rensai/linuxtips/939ntfsmount.html]]にある手順でてきとーにやってみる。

-1. ひろってくる
--[[この辺>http://sourceforge.net/project/showfiles.php?group_id=13956]]にkernel用/user用の両者がある。ntfsprogsのRPMは現時点(2008/10/07)は公開されてないぽいので、srcからつくっておくことにした。
-2. yumっぽい
--fuseとfuse-libsはyum installにした
//-3. ./configure;make
//--1で拾ってきたのは、./configure;make
//-4. 

と思ってやってみたら、爽やかに今の環境(RHEL-AS4u3)では爽やかにkernel再構築は不可避らしい。
---(
$ yum install fuse fuse-libs
Setting up Install Process
Setting up repositories
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package fuse-libs.x86_64 0:2.7.4-8_10.el4 set to be updated
---> Package fuse.x86_64 0:2.7.4-8_10.el4 set to be updated
--> Running transaction check
--> Processing Dependency: fuse-kmdl-2.7.4-8_10.el4 for package: fuse
--> Restarting Dependency Resolution with new changes.
--> Populating transaction set with selected packages. Please wait.
---> Package fuse-kmdl-2.6.9-67.EL.x86_64 0:2.7.4-8_10.el4 set to be updated
--> Running transaction check
--> Processing Dependency: /boot/vmlinuz-2.6.9-67.EL for package: fuse-kmdl-2.6.9-67.EL
Importing Additional filelist information for dependency resolution
--> Finished Dependency Resolution
Error: Missing Dependency: /boot/vmlinuz-2.6.9-67.EL is needed 
	by package fuse-kmdl-2.6.9-67.EL
---)

今日はできそうもないから、この調子だと来月だな orz

// 参考文献
// kernel drv
// http://www.atmarkit.co.jp/flinux/rensai/linuxtips/624ntfsrw.html
// http://saminnet.dip.jp/servercomputer/Lmemo/system/nt07.html
// user drv
// http://www.atmarkit.co.jp/flinux/rensai/linuxtips/939ntfsmount.html


//**vsftpd.conf
//接続時に FFFTPのエラーで「425 Security: Bad IP connecting.」をみたら、
//これはvsftpdがはいてるので、pasv_promiscuous=YESをvsftpd.confに加えよう。

**Windowを他所から飛ばすには
gdmsetupでセキュリティタブを見ると、デフォルトでは''「常にTCP接続を禁止する(全てのリモート接続を無効にする)(X)''にチェックが入ってる。これを外して再起動(=リログ)すれば、xhost +後に他所からwindowを飛ばせる

前から使っていたが、そんな設定だったかーと改めてメモメモ。

**libumem(3LIB)
Solarisにある [[libumem(3LIB)を他OS向けにPortingしているProjectがあった>http://labs.omniti.com/trac/portableumem]]ので、[[つかってみた>libumem]]

**WeirdX(Pure Java X Window System)
WindowsでX Serverを使いたいのは順当な要求であり、普段はcygwin/Xを使っていたが、別のを使いたいと言うことで、[[WeirdX>http://www.jcraft.com/weirdx/]]を使ってみた。特に設定しないで起動するだけで使えるのでいい感じ。注意点は以下の通り。
-1. ディスプレイ番号は 2
-2. sshで接続する場合は別モジュールが必要

サンプルとして、sshモジュールを追加した起動用batファイルを載せとく。execの箇所は長すぎたので改行を入れてるため、読み手の変換必須ですw
---(
@echo off
set ADDRESS="-Dweirdx.xdmcp.address=%TARGTIP%"
set MBDOPT="-Dweirdx.display.charset=JISX"
set KB="-Dweirdx.display.keymap=jp106"
set SSHEXEC="-Dweirdx.sshrexec=yes"
if "%JAVA_HOME%" == "" goto nohome_java
if "%CLASSPATH%" == "" set CLASSPATH=%JAVA_HOME%\lib\classes.zip
if "%WEIRDX_HOME%" == "" set WEIRDX_HOME=.

"%JAVA_HOME%\bin\java" %MBDOPT% -classpath ".;%WEIRDX_HOME%\weirdx.jar;%SWING_HOME%;
%SWING_HOME%\swingall.jar;.\jsch.jar;%CLASSPATH%" %KB% 
%SSHEXEC% com.jcraft.weirdx.WeirdX
---)

***使った様子のss
,1,起動直後。windowがあがる。これがroot window。小さい窓はcmd exec用。
, ,http://mage.oops.jp/images/weirdx/weirdx01.png
,2,接続。sshで接続しつつ、port forwarding。2個目のwindowは認証用。
, ,http://mage.oops.jp/images/weirdx/weirdx02.png
,3,xtermからstartkdeを呼んでKDEをあげてみた図。かなり重いw
, ,http://mage.oops.jp/images/weirdx/weirdx03.png

**netstat -tcpと-tの謎
Linuxのnetstatは-tと-tcpで動作が違い、-tの場合1回、-tcpの場合は1秒毎にぐるぐるになる。いつも忘れるのでメモ。。。
**shellの引数処理
引数処理を書いたので、テンプレ用として転載。
***csh版
配列idxに*を使わない版
---(
#!/bin/csh

echo "argc = $#argv"
set i = 1
set idx = ()
while ( $i <= $#argv )
        set idx = ($idx $i)
        set i = `expr $i + 1 `
end

foreach i ( $idx )
        echo "argv[$i] = $argv[$i]"
end
---)
配列idxに*を使う版
---(
#!/bin/csh

set i = 0
foreach j ( $argv[*] )
        echo "argv[$i] = $j"
        set i = `expr $i + 1 `
end
---)
コマンドライン引数は argvと指定してもいいし、$1とかでもok
***sh版
shiftにした版
---(
#!/bin/sh
echo "argc = $#"
i=1
while [ "$1" != "" ]; do
        echo "argv[$i] = $1"
        shift 1
	i=`expr $i + 1`
done
---)
forにした版
---(
#!/bin/sh
echo "argc = $#"
i=1
for v in $@
        echo "argv[$i] = $v"
	i=`expr $i + 1`
done
---)
まぁ、どっちも大差ない予感。引数処理には[[getoptコマンド>http://software.frodo.looijaard.name/getopt/]]でもいいと思ってちょっと加筆修正したかった。なんとなくサンプルは以下の通り。もっと上手な書き方はいくらもあるだろう。
---(
#!/bin/bash
GETOPT=/usr/local/bin/getopt
GETOPT_ARGS=-q
OPTIONS="fhd:"
BASENAME=`basename $0`
SHOW_USAGE=0
FORCE_MODE=0
FILE_OPTION=0
FILE_PATH=
function usage() {
    cat <<EOF
Usage : $BASENAME [-f] [-h] [-d <file>]
EOF
}

# parse args
for OPT in `$GETOPT $GETOPT_ARGS $OPTIONS $@`
do
    case $OPT in
        "-f")
            FORCE_MODE=1    
            ;;
        "-h")
            SHOW_USAGE=1
            ;;
        "-d")
            FILE_OPTION=1
            ;;
        "--")
            break
            ;;
        *)
            if [ $FILE_OPTION -eq 1 ]; then
                FILE_PATH=`echo $OPT | awk -F\' '{print $2}'`
                FILE_OPTION=0
            fi
            ;;
    esac
done

# do /w options
if [ $FORCE_MODE -eq 1 ]; then
    echo "-f"
fi
if [ -n $FILE_PATH ]; then
    echo "-d $FILE_PATH"
fi
if [ $SHOW_USAGE -ne 0 ]; then
    usage
fi
---)

**Linux用FireFoxでjava-pluginを使えるようにする手順
どっかに日本語ガイドがあった気がするが、どこだか忘れました。基本、mozillaの場合と
一緒で[[ここのガイド>http://www.java.com/en/download/help/5000010500.xml#enable]]の翻訳みたいなもんです。
-1. firefoxの展開ディレクトリ配下にある pluginディレクトリにいく
-2. $JAVA_HOME/jre/plugin/i386/ns7/libjavaplugin_oji.soのsymlinkを作る
-3. もしfirefixが起動中ならfirefoxを再起動する

上記ガイドにあるprefernces設定は無くても(って言うか、設定可能項目がGUI上は無い) firefox 2.0.0.7ではjava-pluginが有効になります。

**いつも忘れる tcshrcの設定
最近家でもLinux([[Fedora7>http://fedora.jp/]]/[[Ubuntu>http://www.ubuntulinux.jp/]])を使っているので、とりあえず初回に入れる設定をメモっておく。
まぁ、cdのaliasがsingle quoteなことをいつも忘れてはまるからこの項を書いたと言うのが真相w
---(
set autoexpand
set autolist
set color
unset autologout
set noautologout
set prompt="`hostname`@`whoami`[\!] "
set savehist=100
set history=100

setenv TERM dtterm
setenv PAGER /usr/local/bin/lv
setenv EDITOR /usr/local/bin/vim

alias ls ls -F
alias l ls
alias ll ls -l
alias cls clear
alias src "source $HOME/.tcshrc"
alias h history
set pwd = `pwd`
alias cd 'cd \!*; set pwd = `pwd`; echo $pwd'
---)

**isoイメージからinstall/pkgの追加
RHEL-AS4だと1枚目のCDさえ焼いておけば(=bootさえすれば)、残りのCDは焼いてある必要は無い。
elilo boot: の所で linux askmethod と入力して anacondaを起動すると、installの途中で isoの在処を聞いて来るので、NFSの先を指定すれば自動的にisoイメージのファイルから必要な分を読み取る。
ファイル名決め打ちで見てるっぽいので、downloadしてからrenameはしない方向で。

また /usr/bin/system-config-packagesも同様にisoを使うことが可能。
これはrootにsuして動くので /usr/bin/consolehelper を経由する。実体は /etc/security/console.apps/system-config-packagesに書いてある通り、/usr/sbin/system-config-packagesスクリプト。
pythonから  /usr/share/system-config-packages/MainWindow.pyが起動される。

で、--helpオプションをつけると
 Usage: system-config-packages [--help] [--tree=PATH] [--isodir=PATH]
とでる。この ''--isodir=''にrhelのisoイメージが置いてあるディレクトリを指定すると、(多分ファイル名決め打ちで)必要なisoイメージを自動で読み取る。なんかisoがNFSサーバにあるとうまく動かないかもw


**SCSI汎用ドライバを使ってみる
仕事でSCSI機器のコマンドに対する応答を調べる必要性ができたので、RHEL-AS4u3とAdaptecのSCSIカード、HP StorageWorks Ultrium960 LTO-3/SCSIを道具にして
触りを書いてみた。

Linuxと言わず、ほぼ全てのOSにuser landからSCSI機器と直接やり取りするためのドライバが
存在していて、これは一般的には pass throughドライバと呼ばれる。Linuxの場合は SCSI Genericドライバ、即ち sgドライバがこの用途のドライバである。

実装から結果まで諸々書くので[[別ページ>LinuxSGDriver]]に。
**service登録
apacheとか使っていると当然のことながらbootに併せて起動して欲しいもんだが、
/etc/rc?.d/にいい加減なのを置くだけじゃだめぽで、chkconfigコマンドで登録する必要がある。

雛形はこんな感じで、これを /etc/init.d/ 配下に apacheというファイル名で置いておく。
---(
#!/bin/sh
#
# chkconfig: 345 77 7
# description: Apache2.2 in /usr/local/apache2
#

BASEDIR=/usr/local/apache2
APACHECTRL=${BASEDIR}/bin/apachectl
PIDFILE=${BASEDIR}/logs/httpd.pid
export LANG=C

function start() {
	echo "starting apache..."
	${APACHECTRL} start
}

function stop() {
	echo "stopping apache..."
	${APACHECTRL} stop
}

function restart() {
	echo "restarting apache..."
	stop
	checkpid
	start
	exit 0
}

function status() {
	if [ -e ${PIDFILE} ]; then
		echo "apache PID is "`cat ${PIDFILE}`
	else
		echo "apache is stopped"
	fi
}

FLAG=0
function checkpid() {
	while [ ${FLAG} -eq 0 ];
	do
		if [ -e ${PIDFILE} ]; then
			sleep 1
		else 
			FLAG=1
		fi
	done
}

function usage() {
	echo "Usage: $0 {start|stop|restart}"
	exit 1
}

if [ $# -eq 0 ]; then
	usage
fi

case "$1" in
	start|stop|status|restart)
		$1
		;;
	*)
		usage
		;;
esac
---)
上記スクリプトの最初数行のコメント部分は chkconfigが parseして、その記載を元に設定が --addの際に行われる。これは --level等他のoptionを指定しない場合のdefault値である。
これで、run level 3,4,5のときは稼動、その他は停止としてchkconfigコマンドで登録できる。
次の2個(77と7)は起動、停止時の優先順位となる。なお、/etc/init.dに置いておけばchkconfigコマンドの実行はどこでやってもいい。
---(
# chkconfig --add apache
---)
** linuxでnfs
NFSサーバにするときは
-1./etc/exports ファイルの編輯
dfsタブ相当だが、fmtは以下の通り。
 [共有するディレクトリ]   [公開先](書き込みの可否)
 【凡例】/home/mage 192.168.0.0/255.255.255.0(ro)
公開先はipやfqdn(*.oops.jpとか)が書ける。複数の公開先を書く場合のデリミタはspace(0x20)
-2. nfsサービスのactivate
あとは以下のコマンドでok。
 # service nfs restart

あとは
 # mount -F nfs -o ro,vers=2 <IP>:<path> <mount先>
って感じで。

**xim
入力はデフォのiiimf+cannaだったのだが、%%例によってeclipseを使うと Ctrl+Spaceがかちあう%%ので、別の([[anthy>http://anthy.sorceforge.jp/]])を導入予定。

で、3.3で見てみたら、コードアシストのkey bindはalt+/だったですYO。。。
IIIMFのdefault keybind(ctrl+space)の設定変更のために費やした1日をどうしろと。orz
しかも www.i18n.orgにあった conversionOnKey設定はRHEL-AS4u4のbundule品では機能しなかったし ;;

**日本語term
mlterm でFA。。。~
とおもいましたが、LANG設定をするとIIIMFとの動作が怪しいので、
結局、gnome-terminalをつかうことに。これはよくできてました。w

**im
通常、Google Talk、Skype、Yahoo! Messangerを使っているので、Linuxでもと思ったが、
全部あきらめました。
,IM名,status
,Google Talk,無し。互換のフリーソフトは存在するが、こいつの用途はbiffなので。。。
,Skype,officialに提供されていて、利用可能。日本語入力は。。。
,YMSG,USサイトにUNIX版が提供されているが、接続先はelfにhard codeされてる。更に日本のYMSGはVer7だが、USはVer9。。。

**KDEデフォ
色々?あって、KDEが良かったので、ログイン時のシステムデフォルトをKDEにした。
公式にもある通り、/etc/sysconfig/desktop ファイルでGNOMEとなっているのを
KDEに変えればok

**w3m-0.5.1のコンパイル
libgc(garbage collectorのライブラリ)のビルドはver6.8でさくっと通ったが、
本体はconfigureがlong longのチェックで死んでた。理由は調べてないが、
workaroundは以下の通り。
 setenv LDFLAGS -Xlinker -R/usr/local/lib

**Canna key stroke
いろんな種類が覚えられないから、ひとつに統一するwrapperが必要だと思うが。。。
,''on/off'',shift+space,''変換'',enter,''次の字種'',ctrl+n,''前の字種'',ctrl+p
,''次の文節'',ctrl+f,''前の文節'',ctrl+b,''文節を長く'',ctrl+o,''文節を短く'',ctrl+i
,''取り消し'',ctrl+g

**PTHREAD_MUTEXATTR(3)の日本語マニュアルバグ
vmwareを普段使いのLinux(RHEL AS4u3/2.6.9-34.ELsmp)にいれようと思ったが、石がXeon 5050(2core HT)
なので、ちゃんと動いていい感じに機能するのかなと思い、テストコードを書いてみた。(後述)~
で、動かしてみると、1thrの場合は普通にspinしてるが、2thr以降だとやたらsysを食って
予想と異なる動きになっていた。mpstatはこんな感じ。(下記の実行結果は、mpstatをinterval 5秒で
実行し、10秒目に出力された結果のみとなっている。)

---(
*thr数1 TIMED_NPの場合
17時24分36秒  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s
17時24分41秒  all   25.53    0.00    0.10    0.00    0.05    0.00   74.32   1092.42
17時24分41秒    0    0.20    0.00    0.00    0.00    0.00    0.00   99.80     19.67
17時24分41秒    1  102.25    0.00    0.00    0.00    0.20    0.00    0.00     47.95
17時24分41秒    2    1.02    0.00    0.20    0.00    0.00    0.00   98.77      0.00
17時24分41秒    3    0.00    0.00    0.00    0.00    0.00    0.00  102.46   1024.80

*thr数2 TIMED_NPの場合
17時25分57秒  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s
17時26分02秒  all   19.73    0.00   30.55    0.00    0.05    0.00   49.67   1099.80
17時26分02秒    0   24.54    0.00   36.40    0.00    0.00    0.00   39.06     11.45
17時26分02秒    1   12.47    0.00   19.63    0.00    0.20    0.00   68.51     44.17
17時26分02秒    2   15.75    0.00   23.52    0.00    0.00    0.00   60.53     21.47
17時26分02秒    3   26.18    0.00   43.15    0.00    0.00    0.00   31.29   1022.90

*thr数2 ADAPTIVE/FAST_NPの場合
17時26分35秒  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s
17時26分40秒  all   50.30    0.00    0.45    0.00    0.00    0.00   49.25   1076.86
17時26分40秒    0   11.07    0.00    0.20    0.00    0.00    0.00   88.73     10.66
17時26分40秒    1   82.09    0.00    0.60    0.00    0.00    0.00   17.71     39.84
17時26分40秒    2   89.34    0.00    0.40    0.00    0.00    0.00   10.26     20.12
17時26分40秒    3   19.32    0.00    0.40    0.00    0.00    0.00   80.68   1006.24

*thr数4 ADAPTIVE/FAST_NPの場合
17時27分05秒  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s
17時27分10秒  all   75.29    0.00   22.61    0.00    0.00    0.00    2.10   1074.30
17時27分10秒    0   74.30    0.00   23.29    0.00    0.00    0.00    2.41     26.71
17時27分10秒    1   75.30    0.00   22.69    0.00    0.00    0.00    2.21     43.37
17時27分10秒    2   76.31    0.00   22.49    0.00    0.00    0.00    1.61   1004.02
17時27分10秒    3   76.10    0.00   22.09    0.00    0.00    0.00    2.01      0.00
---)

試しにSolaris9/E250(2cpu)で下記のコードを実行してみると
予想通りsysはそんなに食わず usr 90%以上で 1thrなら1個分、2cpu以上だと両方と言う感じ。
---(
*thr数1 の場合
CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    0   0  105   402  300   19    9    4    0    0     7   80   0   0  20
  1    0   0    7   118  112   46    5    5    0    0    27   20   2   0  78

*thr数2 の場合
PU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    0   0  121   401  300 1777   14    7  218    0  1902   97   2   0   1
  1    0   0    2   135  113 2071   20    7  352    0  1908   90   7   0   3
---)

なんでこうなるのか分らないが、
-1.threadのf/wはLinuxよりSolarisの方がいけてる気がする
-2.linuxでmutexを使うときはADAPTIVE_NPがよさそう。
-3.mutexを取りあうthr数 < CPU数となるようにmutexは使った方がよさそう

と言うことにしておいて、終了。w


---(
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include	<signal.h>
#include	<pthread.h>

//#define dEBUG(x)	x
#define dEBUG(x)	

#define	STOP_SPIN 0
#define	DO_SPIN 1

static int spin_state = DO_SPIN;
#ifdef __USE_PTHREAD_MUTEX_INITIALIZER
static pthread_mutex_t state_mutex = PTHREAD_MUTEX_INITIALIZER;
#else
static pthread_mutex_t state_mutex;
#endif

typedef struct {
	int id;
	pthread_t tid;
} spin_t;

#define REPORT_MODE	100000
void *spin(void *a) {
	unsigned int i = 0;
	spin_t *args;

	args = (spin_t *)a;
	printf("invoked #%d\n", args->id);
	while ( get_spin_state() != STOP_SPIN ) {
		i++;
		if ( i % REPORT_MODE == 0 ) {
dEBUG(printf("loop %d times at #%d\n", REPORT_MODE, args->id);)
		}
	}

	printf("end of #%d\n", args->id);
	return 0;
}

int set_spin_state(int i) {
	pthread_mutex_lock(&state_mutex);
	spin_state = i;
	pthread_mutex_unlock(&state_mutex);

	return 0;
}

int get_spin_state() {
	int ret = -1;

	pthread_mutex_lock(&state_mutex);
	ret = spin_state;
	pthread_mutex_unlock(&state_mutex);

	return ret;
}

static int __sihret;
void *siginthandler(void *arg) {
	__sihret = 0;
	sigset_t set;
	int num = 0;

	printf("entered siginthandler\n");
	sigemptyset(&set);
	sigaddset(&set, SIGINT);

#ifdef __SOLARIS_BUILD
	sigwait(&set);
#else
	sigwait(&set, &num);
#endif
	set_spin_state(STOP_SPIN);

	printf("Caught SIGINT\n");
	
	return &__sihret;
}

int block_sigint() {
	sigset_t	set;

	sigemptyset(&set);
	sigaddset(&set, SIGINT);
	sigprocmask(SIG_BLOCK, &set, NULL);

	printf("blocked SIGINT\n");

	return 0;
}

int main(int argc, char *argv[]) {
	pthread_t sihpid;
	spin_t	*thrs;
	int thrslen, i, mutextype;
	pthread_mutexattr_t attr;
	int mattrtype = 0;
	
	// init
	pthread_mutexattr_init(&attr);

#ifdef __USE_PTHREAD_MUTEX_INITILIZER // static/dynamic mutex setting block
	// do nothing
#else 

#ifdef __USE_GNU // setting mattrtype block
	mattrtype = PTHREAD_MUTEX_FAST_NP;
#elif __SOLARIS_BUILD
	mattrtype = PTHREAD_MUTEX_NORMAL;
#else // linux default
	mattrtype = PTHREAD_MUTEX_ADAPTIVE_NP;
#endif // end of setting mattrtype block
	pthread_mutexattr_settype(&attr, mattrtype);

#endif // end of static/dynamic mutex setting block
/* Note:(on RHEL AS4u3) of mutex
	pthread_mutexattr(3)のmanページ(日本語訳済)にあるmutex kindの
	値 PTHREAD_MUTEX_FAST_NP は爽やかに存在しない。
[参考] linuxのJM
http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_mutexattr_init.3.html
    これはlocaleがCの場合、opengroup.orgのmanページになる。このmanページでは
    爽やかにpthread_mutexattr_[set|get]typeは別ページになっている。
	以降、後述。
	
	pthraed_mutexattr_gettype(P)のmanページ(日本語訳無し)にある
	mutex kindは
		PTHREAD_MUTEX_NORMAL
		PTHREAD_MUTEX_ERRORCHECK
		PTHREAD_MUTEX_RECURSIVE
		PTHREAD_MUTEX_DEFAULT
	の4種。
[参考] opengroup.orgのMAN
http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_mutexattr_settype.html

	<pthraed.h>にある定義だと

 83 enum
 84 {
 85   PTHREAD_MUTEX_TIMED_NP,
 86   PTHREAD_MUTEX_RECURSIVE_NP,
 87   PTHREAD_MUTEX_ERRORCHECK_NP,
 88   PTHREAD_MUTEX_ADAPTIVE_NP
 89 #ifdef __USE_UNIX98
 90   ,
 91   PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
 92   PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
 93   PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
 94   PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
 95 #endif
 96 #ifdef __USE_GNU
 97   / For compatibility.  / <- この行だけコメント文だったのを変えた
 98   , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP
 99 #endif
100 };

  となっている。__USE_UNIX98はデフォルトでdefineされているが、
  __USE_GNUはdefineされていないので、PTHREAD_MUTEX_FAST_NPを
  使いたい場合、-D optionなりなんなりで、__USE_GNUを定義する
  必要がある。

  ちなみに順当だが、PTHREAD_MUTEX_INITIALIZERで初期化したmutexのtypeは
  0(=PTHREAD_MUTEX_TIMED_NP)になっている。
*/

	pthread_mutexattr_gettype(&attr,&mutextype);
	printf("mutextype is %d\n", mutextype);

	pthread_mutex_init(&state_mutex, &attr);
	block_sigint();
	pthread_create(&sihpid, NULL, 
		siginthandler, NULL);

	if ( argc > 1 ) {
		thrslen = atoi(argv[1]);
	} else {
		thrslen = 0;
	}
	thrs = (spin_t *)malloc(sizeof(spin_t)*thrslen);
	// main
	for ( i = 0; i < thrslen; i++ ) {
		(thrs+i)->id = i;
		pthread_create(&((thrs+i)->tid), NULL,
			spin, thrs+i);
	}

	// end
	pthread_join(sihpid, NULL);
	for ( i = 0; i < thrslen; i++ ) {
		pthread_join((thrs+i)->tid, NULL);
	}
	
	printf("end of test\n");
	return (0);
}
---)

上記のコードをコンパイルする際の -D optionは以下の通り。
- -D__USE_PTHREAD_MUTEX_INITIALIZER
-- PTHREAD_MUTEX_INITIALIZERを利用
- -D__SOLARIS_BUILD(Solaris用)
-- PTHREAD_MUTEX_NORMALを利用
- -D__USE_GNUか設定無し(linux用) 
-- PTHREAD_MUTEX_FAST_NP = PTHRAED_MUTEX_ADAPTIVE_NP を利用

linkerに渡すのはgccなら -lpthreadだけでok(Linux/Solaris両方)

で、''本節の本題はコードのコメント中に書いてあったり''しる。w

**bashでtrap
とあるツールをcronを使わないで、1時間おきに動かしたいと思って、
bashのwrapper scriptを書いてみた。~
以下の理由
-1.term groupに属しているprocessがいると、login shellをlogoutしてもtelnet sessionが切れない
-2.signal handlerで生きてるかログファイルにはく口を用意しても、ログに出力がない

でちゃんと動いてるか疑問だったので、ちと調べてみた。

以下がテスト用スクリプト
---(
#!/bin/bash
LOG=/home/witchcraft/work/test.20061206/log.txt

function usr1 {
	echo "caught SIGUSR1" 2>&1 >>${LOG}
}
trap "usr1" USR1

# ログファイルのclearはこんな感じで動く。
# bashのシグナルハンドラは、sleep中はシグナル tableに入ったままで
# 処理はしない。2個以上の同一シグナルが入った場合、上書き。
# シグナルはtableのbit 0/1であり無しをチェック出来るという感じ。
function trunc {
	echo > ${LOG}
}
trap "trunc" USR2

# こんな感じのを動かして、logoutするとok
rm -f ${LOG}

while [ 1 ] ; do
	date  2>&1 >>${LOG}
	sleep 10
done
---)

と言うことで、こんな感じで書いておいて、&実行+logoutで無問題らしい。

* 参考リンク
- SeaMew's RPMs
-- http://sea-mew.jp/nox/modules/rpms/
- RHEL-AS4u4でyumを使いたい
--[[@IT サポートが終了したRed Hat Linuxをアップデートするには(yum編)>http://www.atmarkit.co.jp/flinux/rensai/linuxtips/599endrhlup.html]]
--[[RHEL4でもyumを使いたい場合>http://d.hatena.ne.jp/ZIGOROu/20061217/1166377279]]
サポートが終了したRed Hat Linuxをアップデートするには(yum編)


Last-modified: 2013-05-07 15:38:42