私は新しいクライアントが接続するたびに新しいスレッドを生成するCで書かれたサーバを持っています。私のサーバーをテストするために、私は500のクライアントをエミュレートするスクリプトを書いています。サーバは百のクライアントの最初のカップルを処理し、終わりに向かって、私はValgrindのから次のエラーを取得:FBServer.cにライン82でValgrindでVgTs_WaitSysのエラーは何を意味しますか?
Thread 456: status = VgTs_WaitSys
==4182== at 0x4E383EC: recv (recv.c:34)
==4182== by 0x4017F1: process_data (socket2.h:45)
==4182== by 0x40195E: thread (FBServer.c:82)
==4182== by 0x4E30A03: start_thread (pthread_create.c:300)
==4182== by 0x532DD4C: clone (clone.S:112)
Thread 457: status = VgTs_WaitSys
==4182== at 0x4E383EC: recv (recv.c:34)
==4182== by 0x4017F1: process_data (socket2.h:45)
==4182== by 0x40195E: thread (FBServer.c:82)
==4182== by 0x4E30A03: start_thread (pthread_create.c:300)
==4182== by 0x532DD4C: clone (clone.S:112)
...
Thread 499: status = VgTs_WaitSys
==4182== at 0x4E383EC: recv (recv.c:34)
==4182== by 0x4017F1: process_data (socket2.h:45)
==4182== by 0x40195E: thread (FBServer.c:82)
==4182== by 0x4E30A03: start_thread (pthread_create.c:300)
==4182== by 0x532DD4C: clone (clone.S:112)
を、スレッドがクライアントからデータを受信process_dataという関数を呼び出します。関数process_dataを以下に示します。
void process_data(int clientSock)
{
size_t n;
char jstring[MAX_LEN + 1];
int bytes_received_so_far = 0;
int bytes_count;
char *buf = NULL;
while(bytes_count = recv(clientSock, jstring, MAX_LEN, 0))
{
if(bytes_count <= 0)
{
close(clientSock);
pthread_exit(NULL);
}
printf("Bytes received = %d\n", bytes_count);
jstring[bytes_count] = '\0';
...
...
}
}
誰かがエラーメッセージの解釈に私を助けることができます。
これはvalgrindが提供する最初のエラー(または出力)ですか? – nos
あなたはどのプラットフォームにいますか?開いているファイル記述子の数に制限がある場合は、プラットフォームに依存します。たとえば、私のLinuxのボックスでは、一度に1024のファイルと128の半分の接続を持つことができます。 – zdav