目次

RHLEを使ってみる

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

RHEL6の Extra Package

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

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のdrvを拾ってやることにした。二つの方法が提供されている。

@ITの解説にある手順でてきとーにやってみる。

  • 1. ひろってくる
    • この辺にkernel用/user用の両者がある。ntfsprogsのRPMは現時点(2008/10/07)は公開されてないぽいので、srcからつくっておくことにした。
  • 2. yumっぽい
    • fuseとfuse-libsはyum installにした

と思ってやってみたら、爽やかに今の環境(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

Windowを他所から飛ばすには

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

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

libumem(3LIB)

Solarisにある libumem(3LIB)を他OS向けにPortingしているProjectがあったので、つかってみた

WeirdX(Pure Java X Window System)

WindowsでX Serverを使いたいのは順当な要求であり、普段はcygwin/Xを使っていたが、別のを使いたいと言うことで、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用。
2接続。sshで接続しつつ、port forwarding。2個目のwindowは認証用。
3xtermからstartkdeを呼んでKDEをあげてみた図。かなり重いw

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コマンドでもいいと思ってちょっと加筆修正したかった。なんとなくサンプルは以下の通り。もっと上手な書き方はいくらもあるだろう。
#!/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の場合と 一緒でここのガイドの翻訳みたいなもんです。
  • 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/Ubuntu)を使っているので、とりあえず初回に入れる設定をメモっておく。 まぁ、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ドライバがこの用途のドライバである。

実装から結果まで諸々書くので別ページに。

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)を導入予定。

で、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なので。。。
Skypeofficialに提供されていて、利用可能。日本語入力は。。。
YMSGUSサイトに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/offshift+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で無問題らしい。

参考リンク


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