C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: write()ha


(過去ログ 131 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■77544 / inTopicNo.1)  write()ha
  
□投稿者/ こまお (23回)-(2015/10/30(Fri) 16:25:10)

分類:[C/C++] 

こんにちはソケット通信勉強中です。
write()の返値ですが、説明がたいがい微妙で
『書きこんだバイト数を返す』とあります。
第3引数より少ないことがあるのかないのか
どなたか『言いきって』くれませんか。

↓こんな関数を書かないといけないの?

bool forceWrite(int handle, void *buf, unsigned n) {
 int written = 0;

 do {
  int temp = write(handle, &(((char*)buf)[written]), n - written);
  if (temp < 0) {return false;}
  written += temp;
 } while(written != n);

 return true;
}

引用返信 編集キー/
■77545 / inTopicNo.2)  Re[1]: write()ha
□投稿者/ こまお (24回)-(2015/10/30(Fri) 16:28:20)
ホントは『write()は書きのこすか?』にしたかったんですが、
タイトル打ってる時リターンキーで投稿されてしまうんですよ、トホホ


引用返信 編集キー/
■77547 / inTopicNo.3)  Re[1]: write()ha
□投稿者/ ito (2回)-(2015/10/30(Fri) 17:03:33)
No77544 (こまお さん) に返信
> 第3引数より少ないことがあるのかないのか
> どなたか『言いきって』くれませんか。
そのとおり、少ないことがあります。

> ↓こんな関数を書かないといけないの?
ですので、そんな関数を書かないといけません。
ちなみに、ソケットであれば該当ソケットに書き込み/読み込みできるかどうかを判断するためのselect()という関数があります。

引用返信 編集キー/
■77549 / inTopicNo.4)  Re[2]: write()ha
□投稿者/ 774RR (333回)-(2015/10/30(Fri) 18:20:45)
> 第3引数より少ないことがあるのかないのか
あります。

でもそんな関数を書いてしまうと無駄に CPU を使ってしまうのでまずいっす。
write を呼ぶ→OS内バッファがいっぱいなので0が返却される→即また write を呼ぶ→

EWOULDBLOCK や EAGAIN が返却される場合も考慮してない。
この辺はブロックモードか非ブロックモードかで挙動が異なるので提示のコード断片だけでは判断不能っす。

やりかたはいっぱいあるので、プログラム全体的に「こういう挙動をして欲しい」が無いと設計不能っす。


引用返信 編集キー/
■77586 / inTopicNo.5)  Re[3]: write()ha
□投稿者/ こまお (25回)-(2015/11/04(Wed) 11:55:17)
ありがとうございます。
OS側のバッファ残量によっては返値が引数より小さくなる場合があるよ。とい
うことですね。で、OSがバッファの内容を吐くまで少し待ってあげないとCPU
を無駄遣いすることになるよ、と。

そんなにシビアでなくただ届けばいい程度なら、こんな(↓)感じでしょうか。

//改良版
bool forceWrite(int handle, void *buf, unsigned n) {
 int written = 0;

 do {
  int temp = write(handle, &(((char*)buf)[written]), n - written);
  if (temp < 0) {
   if ((ERRNO != EWOULDBLOCK)&&(ERRNO != EAGAIN)) {return false};
   temp = 0;
  }
  written += temp;
  usleep(100);
 } while(written != n);

 return true;
}

EWOULDBLOCKやEAGAINの時の返値が-1か0か怪しい気がしたので、どちらになっ
てもいい様に書いてみました。

引用返信 編集キー/
■77587 / inTopicNo.6)  Re[4]: write()ha
□投稿者/ こまお (26回)-(2015/11/04(Wed) 12:02:24)
ん!?、EINTRもありうるのかな??
引用返信 編集キー/
■77627 / inTopicNo.7)  Re[5]: write()ha
□投稿者/ こまお (27回)-(2015/11/09(Mon) 14:09:57)
先の改良版はダメだったので訂正に来ました(^^;

bool forceWrite(int fd, void* buf, unsigned n) {
 int written = 0;

 for(;;) {
  int temp = write(fd, &(((char*)buf)[written]), n - written);
  if (temp < 0) {
   if ((ERRNO != EWOULDBLOCK)&&(ERRNO != EAGAIN)&&(ERRNO !=EINTR)) {return false};
   temp = 0;
  }
  written += temp;
  if (n <= written) {break;}
  usleep(100);
 }

 return true;
}

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -