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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

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

#1

投稿記事 by shiro4ao » 14年前

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でのバイナリファイルの書き込み

#2

投稿記事 by つうこうにん » 14年前

はっきりしたことはいえませんが。

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

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

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

つうこうにん

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

#3

投稿記事 by つうこうにん » 14年前

すみません。
printf()で出力するのにmemset()必要ですね。
またはif(ret2>0)buf2[ret2]='\0';
のようにすればprintf()で出力できると思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 14年前

pthreadをexit(0)で抜けたことが無いので、どんなことが起こるかわかりませんね。
通常はpthread_exitか素直にreturnを書くと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

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

#5

投稿記事 by shiro4ao » 14年前

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


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


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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 14年前

スレッドに関しては、こちらが参考になると思います(ユーザー登録必要)。
「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, 岩本 信一: 本」
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

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

#7

投稿記事 by shiro4ao » 14年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る