メールボックスサーバーをシミュレートする大きなプロジェクトを宿題として作成しました(同じコンピュータ上のプロセスを介して、FIFOを使用するので、宿題です)fifo上のデータの書き込み/読み取りの正しい方法
大きなファイル(たくさんあります)があるのでプロジェクトを投稿できませんが、データが失われたり、完全性が保持されないことがあります。
は、私はそれが多少間違っている、データを送信するためにこれらのコードスニペットを使用Network_IOは私が話している機能である:?
#include "Network.h"
int Network_Open(const char* path,int oflag)
{
return open(path,oflag);
}
ssize_t Network_IO(int fifo,NetworkOpCodes opcode,void* data,size_t dataSize)
{
ssize_t retsize = 0;
ssize_t tmpDataSize = (ssize_t)dataSize;
errno = 0;
if (tmpDataSize == 0) return 0;
while ((retsize = (opcode == NetworkOpCode_Write? write(fifo,data,tmpDataSize) : read(fifo,data,tmpDataSize))) != tmpDataSize)
{
if (errno != EINTR) break;
}
return retsize;
}
Boolean Network_Send(int fifo,const void* data,size_t dataSize)
{
return ((ssize_t)dataSize) == Network_IO(fifo,NetworkOpCode_Write,(void*)data,dataSize);
}
Boolean Network_Receive(int fifo,void* data,size_t dataSize)
{
return ((ssize_t)dataSize) == Network_IO(fifo,NetworkOpCode_Read,data,dataSize);
}
Boolean Network_Close(int fifo)
{
if (fifo >= 0)
return close(fifo) == 0;
}
編集1:私は実際にテストするために使用していコードスニペットwrite
ケースでは
Boolean Network_IO(int fifo,NetworkOpCodes opcode,void* data,size_t dataSize)
{
ssize_t retsize = 0;
ssize_t tmpDataSize = (ssize_t)dataSize;
ssize_t sentDataSize = 0;
errno = 0;
if (tmpDataSize == 0) return True;
while (sentDataSize < tmpDataSize)
{
switch(opcode)
{
case NetworkOpCode_Write:
retsize = write(fifo,data + sentDataSize,tmpDataSize - sentDataSize);
break;
case NetworkOpCode_Read:
retsize = read(fifo,data + sentDataSize,tmpDataSize - sentDataSize);
break;
}
if (retsize < 0)
{
if (errno != EINTR) return False;
else
{
errno = 0;
continue;
}
}
sentDataSize += retsize;
}
if (errno != 0)
return False;
return sentDataSize == tmpDataSize;
}
Boolean Network_Send(int fifo,const void* data,size_t dataSize)
{
return Network_IO(fifo,NetworkOpCode_Write,(void*)data,dataSize);
}
Boolean Network_Receive(int fifo,void* data,size_t dataSize)
{
return Network_IO(fifo,NetworkOpCode_Read,data,dataSize);
}
でコードスニペットを見ることができるのかを見出そうとしています。あなたの答えが面白いと思うのですが、これは私のデザイン決定について議論する必要がないケースです。その選択の周りには多くのことがあります。私は書き込み/読み取り呼び出しを「ラッピングする」という決定を変更しません。 **ブロッキング**は実際に教師が学習目的で尋ねるものです。 –
あなたのプログラムは「ほぼ正しい」というケースがあります。コンピュータプログラムを書き込んでデバッグすることはできますが、書き込むことは分かりません。デザインの選択に関する文章的なコメントは、批評を意図したものではなく、デザインが重要であることを認識させるためのものです。プログラミングは簡単ではなく、プログラムを設計することは簡単ではありません。 BTW:Linuxのマウント可能なファイルシステムは、関数ポインタ、多かれ少なかれオブジェクト指向の抽象化を実装しています。 – wildplasser
デザインの背後にある主な問題は、宿題であり、 "先生が言うように"行う必要があることがあります。具体的にはループメソッドです。先生のメモで見つけることができるので、直接使用しましたが、完全に正しい、私はデータの "remaning部分"を送信する必要があると思うと述べたように、私はそれを試してみます。私はデザインに焦点を当てていますが...まあ、私はCを嫌い、たくさんの日に書くと気が狂っています –