[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:75786] RedHat6.2でのpthreadプログラミングについて


RedHat5.2で動作していたアプリケーションをそのまま
RedHat6.2で実行したところうまく動作しませんでした。
いろいろ調べたら、子スレッド内でシェルを起動することが
できないようなのです。下のような簡単なテストプログラムを
作成したのですが、動きが5.2と6.2では異なります。
どうもglibcのバージョンの違いが原因のようなのですが
何か対策教えてください。

次のようなプログラムを RedHat5.2で実行したときにはOK
 (bashが起動され、bashをexitすると同時に子スレッドとメインスレッドともに終
了)
  画面には
       thread Create ID<******>
       start thread
          bashが起動され、exitとすると
       end thread
       end program
でしたがRedHat6.2で実行したときにはNG
 (bashの起動が失敗?。そのときにどうもメインスレッドが終了しているよう。子
スレッドは残っている)
    画面には
   start thread
    と表示されたまま
でした。

 コンパイル・リンクはccで、ライブラリは-lc -lm -pthreadを指定しました。
ちなみに
    RedHat5.2で以下のプログラムをスタティックリンク(-static)して
    RedHat6.2上で実行したところ正常に動作しました。
    以上から glibc(RedHat5.2は2.0.?でRedHat6.2は2.1.3)のバージョンの違いが
   問題なのではと考えているのですがどうでしょうか?
    sackware 7.0(glibc 2.1.2)でも正常に動作したという情報もありました。
    他にもどんなディトリビューションで動作したまたは動作しないなどの
    情報もあれば教えてください。

#include <unistd.h>
#include <pthread.h>
int exitf=0;
void *ThreadProc(void *p)
{
  printf("start thread\n");
  system("bash"); /* 実行するプログラムは何でも同じ。この行の実行でメイン
スレッドが無くなってしまう*/
  /* sleep(5);   単なるスリープならうまく実行される*/
  printf("end thread\n");
  exitf=1;
}

main()
{
  int status;
  pthread_t threadID;
  status=pthread_create(&threadID,NULL,ThreadProc,NULL);
  if ( status!=0 ) {
    printf("thread create error!!\n");
  } else {
    printf("thread create ID<%d>\n",threadID);
    pthread_detach(threadID);
    while(!exitf) sleep(0);
  }
  printf("end program\n");
}

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」