ページ 11

Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 04:49
by shiro4ao
Linux(ubuntu10.10)上で現在TCPにてある通信を行うプログラムを書いていて、
その通信のログを取りたいと思います。
確認のためのprintf()の部分では通信データがすべて出てくるのですが、
ファイルの書き込みがうまくいっていないのか、
ログファイル(log)にはprintf()で見える通信データの半分とすこししか
残っていませんでした。
(printf()されるデータは実際の通信データと照合して正しいとわかっています)

fwrite()のつかいかたがあやしいのですが、通信データはバイナリを扱う場合もあるため
テキスト用の関数が使えないのです。

なにかいい方法はありますでしょうか?

コード:

//通信内容保存スレッド
void* thread2(void* pParam)
{
	char *buf2;
	int ret2;
	FILE *file2;
	int i;

	i=0;

	buf2=(char*)malloc(sizeof(char)*100000000);
	file2 = fopen("log","wb");
	
	while(1){
		i++;
		memset(buf2,'\0',ret2);
		ret2 = recv(ClientSock, buf2, 100000000,0);
	
		printf("\n%d\n%s\n\n\n",i,buf2);			//確認のために
		fwrite(buf2,ret2,1,file2);			//データを書き込む・・・・
	
		if(ret2<=0)break;
  }
	fclose(file2);
	exit(0);

}

Re: Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 06:44
by つうこうにん
はっきりしたことはいえませんが。

まずret2が中身が不定のまま使われています。(memset()一回目呼び出し)
それに、今回の場合はmemset()はいらないんじゃないでしょうか?

それとret2 = recv()で0以下の値が入るようですが
それを引数としてfwrite()に渡しています。

ほかには親スレッドが終了したとき
子スレッドは強制終了すると思うので
fclose()が呼ばれる保証がないと思うのですが。
そのためバッファのフラッシュが行われないため
ファイルに書き込まれていないと考えることができます。
毎回fwrite()したあとにfflush()を呼ぶか
子スレッドを終了させてから親スレッドを終了させるなどすれば
解決するかもしれません。

Re: Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 07:21
by つうこうにん
すみません。
printf()で出力するのにmemset()必要ですね。
またはif(ret2>0)buf2[ret2]='\0';
のようにすればprintf()で出力できると思います。

Re: Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 10:04
by softya(ソフト屋)
pthreadをexit(0)で抜けたことが無いので、どんなことが起こるかわかりませんね。
通常はpthread_exitか素直にreturnを書くと思いますが。

Re: Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 17:20
by shiro4ao
>つうこうにんさん
ご指摘の通りに、fflush()したら、ちゃんと最後まで書きこんでくれるようになりました。
ストリームのバッファに残っている状態で強制終了してたから後ろの部分を書きこんでくれなかったのですね。
printfの部分はデバッグ用に書いてあるだけなのでとりあえず削除して対応しました。
ありがとうございます。


>softyaさん
終了する場合はreturnで抜ければいいのですね。
明らかに通信が終わったのに、いつまでものこってるプロセスが
いるのが疑問でしたが、分かりました。
ありがとうございます。


なんとか、動くようになりましたが、
まだまだやっちゃいけないことをやっていそうで怖いです。
マルチプロセスに慣れたいですね。
ありがとうございました。これにて解決とさせて頂きます。

Re: Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 17:37
by softya(ソフト屋)
スレッドに関しては、こちらが参考になると思います(ユーザー登録必要)。
「pthreadについて:CodeZine(コードジン)」
http://codezine.jp/article/corner/32

あと、こんな本もあります。
「Amazon.co.jp: Pthreadsプログラミング: Bradford Nichols, Dick Buttlar, Jacqueline Proulx Farrel, 榊 正憲: 本」


中古の本ですが、これでも良いと思います。
「Amazon.co.jp: Pスレッドプログラミング: ビル ルイス, ダニエル バーグ, Bil Lewis, Daniel J. Berg, 岩本 信一: 本」

Re: Linuxでのバイナリファイルの書き込み

Posted: 2012年2月12日(日) 23:13
by shiro4ao
拝見させていただきました
やっぱりスレッドは処理系のことをちゃんと知っていないといけないので
大変そうですが(とくに同期がががが)、書店でどんなかんじか見てみたいと思います
ありがとうございます