- 締切済み
gmtime()で止まってしまいます・・・
こんにちは、gmtime()で止まってしまい非常に困っております。 C言語でWebアプリを開発しております。フォームの値やら環境変数がかなり面倒なので、デバッガは使っていません。 今回問題になっているのは、 01:void GetDay(char *str) 02:{ 03: struct tm *Ti; 04: time_t now = time(NULL); 05: Ti = gmtime(&now); 06: sprintf(str,"%04d-%02d-%02d",Ti->tm_year,Ti->tm_mon+1,Ti->tm_mday); 07:} これが問題のサブルーチンです。 5行目で止まります。 おそらくはメモリ違反だと思われますが、この関数内で定義した変数を使っていますが、それでも、どこか他のメモリの取り方の問題で5行目で止まってしまうことがあるのでしょうか? ちなみに、gmtimeの代わりにlocaltimeを使っても同様です。 nowの値がおかしくなっているのでは?と思いましたが正常でした。念のためgmtimeの直前に0にしてみましたが、それでも同じ現象でした。 このプログラム内で複数回このルーチンを呼び出しますが、最初の数回は上手く動いています。 5行目で止まるというのは、1行ごとprintfを行い、どこで止まっているか見て判断しています。 もちろん、fflush(stdout)はしています。 OSはRedHat の ES3.0です。 何か考えられる事などありましたら、よろしくお願いします。 gdb以外でいいデバッガがあったら紹介していただけると助かります。 8年間プログラマしていますが、このような事は初めてです。(T-T)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
#1の方がいわれていることが原因でないなら、 Webアプリということなので、それを前提に考えると void GetDayはスレッドセーフである必要があります。 ところが、gmtime()はスレッドセーフではありませんので、スレッドセーフなgmtime_r()を使う必要があります。 man gmtimeによると、gmtime_rはlibc 5.2.5以降で利用可能となっています。もし、可能なら、そちらを使ってみてはいかがですか。もし使えないなら、この関数のみ、マルチスレッドで動くことを禁止する必要があります。 但し、スレッドセーフでないものをマルチスレッドで動作させたからといって、gmtimeで止まるかどうかは、やってないので、私は判りません。 本件とは、直接関係ありませんが、日付に2005-08-08のような結果を期待するなら、Ti->tm_yearはTi->tm_year+1900とした方が、良い結果がえられると思います。
- HOGERA3
- ベストアンサー率35% (50/139)
実は6行目のsprintf()で止まっていたりはしませんか? strのメモリが確保されてないだけだったりとか
お礼
回答ありがとうございます。 sprintf()を消しても結果は同じでした。
お礼
このプログラム自体は重複して動くことはありません。 テスト中で私しかこのサーバーで動かしていないというのもあります。 このプログラム内でも、スレッド化している部分はありますが、そこをコメントにしても現象は改善されませんでした。 gmtime_rという関数は知らなかったです。こちらも調べてみます。 ちなみに、Ti->tm_year+1900というのは実はやっています。いらんコメントを削除しているときに間違って消してしまっていました。(^^; 貴重な意見ありがとうございました