[SCore-users-jp] SCoreのlibpthread
hagi
hagiwaya @ pst.fujitsu.com
2003年 9月 4日 (木) 13:41:02 JST
富士通プライムソフトテクノロジの萩原です。
いつもお世話になっております。
現在、SCore上でテストプログラムを作成しているのですが、
-lpthreadを指定してコンパイルした場合に/proc/<PID>/*の
ファイルにアクセスできません。
RedHat 7.3 + SCore5.4.0とRedHat 7.3 + SCore5.2.0で
発生することを確認しました。
SCore5.2.0の場合は、GNUコンパイラ・富士通コンパイラの
両方で試しましたがどちらを使用しても発生しました。
調べてみると、-lpthreadを指定した場合は、/proc/<PID>/*
のファイルのオーナがrootになっていました。
-lpthreadを指定しない場合は、一般ユーザのままです。
下記プログラムはプロセスのuid,pid を表示して、
/proc/<PID>/exe をオープンしてみるだけの簡単なものです。
--a.cc----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <mpcxx.h>
#include <sc.h>
main(int argc, char *argv[])
{
char procdir[256];
FILE *exe;
mpcxx_spmd_initialize(argc, argv);
printf("After initialize : getuid=%d\n", getuid());
printf(" : geteuid=%d\n", geteuid());
printf(" : getpid=%d\n", getpid());
sprintf(procdir, "/proc/%d/exe", getpid());
exe = fopen(procdir, "r");
if ( exe != NULL ) {
printf("%s open success.\n", procdir);
} else {
printf("%s open failed. errno=%d\n", procdir, errno);
}
}
----------------------------------------
上記プログラムを以下のように翻訳しますと正常にオープンできます。
$ mpc++ a.cc
$ scrun -group=g2,nodes=2x1 ./a.out
SCOUT: Spawning done.
SCore-D 5.4.0 connected.
<0:0> SCORE: 2 nodes (2x1) ready.
After initialize : getuid=9999
: geteuid=9999
: getpid=18319
/proc/18319/exe open success.
After initialize : getuid=9999
: geteuid=9999
: getpid=16706
/proc/16706/exe open success.
SCOUT: Session done.
ところが、これに SCore の libpthread.a をリンクするようにしますと、
$ mpc++ -o lpth a.cc -lpthread
$ scrun -group=g2,nodes=2x1 ./lpth
SCOUT: Spawning done.
SCore-D 5.4.0 connected.
<0:0> SCORE: 2 nodes (2x1) ready.
After initialize : getuid=9999
: geteuid=9999
: getpid=18368
/proc/18368/exe open failed. errno=13
After initialize : getuid=9999
: geteuid=9999
: getpid=16755
/proc/16755/exe open failed. errno=13
SCOUT: Session done.
このようにオープンに失敗します。
errno=13 (EACCES: Permission denied) なので
確認してみたとこと計算ノード上の/proc/18368/*と
/proc/16755/* オーナが root になっていました。
同じプログラムを1ノードで実行すると、
$ scrun -group=g2,nodes=1 ./lpth
SCOUT: Spawning done.
SCore-D 5.4.0 connected.
<0:0> SCORE: One node ready.
After initialize : getuid=9999
: geteuid=9999
: getpid=1888
/proc/1888/exe open success.
SCOUT: Session done.
正常に動作します。
コンパイル時にチェックポイント機能をはずしてみたところ、
なぜかこちらも正常に動作しました。
$ mpc++ -o nockpt -nockpt -lpthread a.cc
$ scrun -group=g2,nodes=2x1 ./nockpt
SCOUT: Spawning done.
SCore-D 5.4.0 connected.
<0:0> SCORE: 2 nodes (2x1) ready.
After initialize : getuid=9999
: geteuid=9999
: getpid=4987
/proc/4987/exe open success.
After initialize : getuid=9999
: geteuid=9999
: getpid=1688
/proc/1688/exe open success.
SCOUT: Session done.
コンパイル時にnockptオプションをつけた場合、
SCoreのチェックポイント機能が使用できないこと
以外になにか制限がつくのでしょうか。
SCore の libpthread をリンクすると/proc/<PID>/* の
ファイルのオーナが root になってしまうという現象は
SCore のバグ、もしくは仕様なのでしょうか。
これを直していただくことはできないでしょうか。
以上、よろしくお願いいたします。
--
hagi <hagiwaya @ pst.fujitsu.com>
SCore-users-jp メーリングリストの案内