[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 メーリングリストの案内