私は2つのファイルを聴くサーバプログラムを作成する必要がある宿題としてかなり大きなプロジェクトを作成しています。fifo上のsyscallがブロックされていませんか?
私は怒っている何かがあります:私はクライアントとサーバー間のいくつかの書き込み/読み取りから構成されている操作を行うたびに、クライアント上でFIFOを閉じると、まだそれらのFIFOを開いたままにしている人がいるということです。
このため、サーバーは各操作の後に64バイトを読み込もうとしましたが、失敗しました(0バイトを読み取る)。操作ごとに1つだけの時間がこの事が起こる、それはそれは、クライアントへの任意の問題を作成しませんが、それは本当に奇妙だと私はバグのこれらのタイプを憎む64バイト
を読み取ろうと守らない
私はそれがオープン/クローズに関連する問題であり、クライアントがロックを使用しているという事実であると考えてください。
注意、オープン操作に使用されるフラグは、この擬似コードのテキスト
Serverの動作に指定されています。私は直接投稿することはできません
Set a lock on Fifo(1) (waiting if there is already one)
Set a lock on Fifo(2) (same as before)
Open Fifo(1) for WRITING (O_WRONLY)
Open Fifo(2) for READING (O_RDONLY)
Do some operations
Close Fifo(1)
Close Fifo(2)
Get lock from Fifo(1)
Get lock from Fifo(2)
:
Open Fifo(1) for READING (O_RDONLY)
Open Fifo(2) for WRITING (O_WRONLY)
Do some operations
Close Fifo(1)
Close Fifo(2)
クライアントの動作プロジェクトはかなり大きく、私は直接システムコールを使用しないので、ネットワーキングに使用される関数を除いて、コードです。ここには:
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;
errno = 0;
if (dataSize == 0) return 0;
while ((retsize = (opcode == NetworkOpCode_Write? write(fifo,data,dataSize) : read(fifo,data,dataSize))) < 0)
{
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;
}
ありがとう、ありがとうございます。
EDIT 1:
クライアント出力:http://pastie.org/2523854 サーバ出力(straceの):http://pastie.org/2523858
Network_Openで開くためにどのフラグを渡していますか? – asm
O_RDONLYは書き込み用、O_WRONLYは書き込み用、その他は –