C++にて、他プログラムが書き込み中のプログラムを読み取り専用で開き、whileループで繰り返しデータを読み取っているのですが、
たまにseekgでsegmentation faultが発生しプログラムが落ちてしまいます。
ネットで調べても、readやopenでのsegfaultの問題などは見つかりますが、seekgでのsegfaultは見つかりません。
原因は何でしょうか?また、どうすれば解決できますか?やはり他プログラムで同時に同ファイルへの書き込みを行っているのが問題なのでしょうか?
ちなみに直前でclear()を実行するようにしてもsegfaultになり、その場合はclear()実行時にsegfaultが発生します。
seekg(0, std::ios_base::beg)でファイルの先頭に移動しようとしても同じようにsegfaultが起きてしまいます。
よろしくお願いします。
C++
1std::ifstream ifs("./a", std::ios::in|std::ios::binary); 2while(1) { 3 int64_t offset = ..; 4 size_t size = ..; 5 char buf[size]; 6 //ifs.clear(); //←これを追記してもここで落ちる(ifs.seekg(0, std::ios_base::beg)でも落ちる) 7 ifs.seekg(offset, std::ios_base::beg); //←ここでたまに落ちる 8 if (ifs.read(buf, size)) { 9 .. 10 } else { 11 .. 12 } 13}
offsetやsizeを計算している部分など、..で書いている部分を開示してもらえますか? 関数で落ちているのではなく、その直前の領域確保で失敗していたりするかもしれないので。あと環境も。
offset、sizeの部分なのですが、ファイルへの書き込みを行っている別のプログラムAからプロセス間通信でオフセット、サイズ、ファイルパスをテキストデータで受け取っています。それを別スレッドが受信、キューにプッシュして、Aがsyncを実行したらすべてポップしてその情報を元にデータを読み取りに行っています。
環境はCentOS7 64bit、メモリ16GBのIntelCPUです。
その情報が間違っている可能性は? 例えばsizeで0とか-1とかが得られていると簡単に暴走しそうですが。
一応ログに吐いて確認してますが、そういったことにはなってません。また、seekgだけではなくclearを呼び出したり、ファイルの先頭にシークしようとしてもsegfaultになるので、そういったことが原因ではないと思われます。
解決いたしました。majiponiさんの仰るとおり直前での領域確保に失敗していました。軽い考えで否定してしまい大変失礼しました。
回答4件
あなたの回答
tips
プレビュー