差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
* 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