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");
}