私はCで書かれた単純なサーバープログラムを持っており、そのプログラムはUbuntuLinuxディストリビューションで実行されています。このプログラムは、クライアントから送信されたメッセージをリッスンし、それらのメッセージをファイルに書き込み(各メッセージは個別のファイルに入れられます)、メッセージが受信されて保存されたら、クライアントに確認応答を送り返すことを目的としています。
サーバーがメッセージの受信と保存を続けると、使用可能なシステムメモリの量が急速に減少し、メッセージが停止するまで減少し続けることに気づきました。メッセージが送信されていないとき、メモリは一定のままです。ただし、書き込まれたファイルをディスクから削除することで、メモリを再び解放できることにも気づきました(サーバーがまだ実行されている場合でもこれを実行できます)。したがって、ファイルを書き込むコードに問題は見られませんが、メモリの問題はファイル操作に関係していると思われます。
誰かが助けることができますか?
注:「top」でメモリ使用量を監視しています。
プログラムからの抜粋を含めました。以下の関数は、クライアントからの入力を処理し、その情報をファイルに書き込みます。これは私が現在問題があると私が信じているところです:
void handleinput (int sock)
{
char filename[strlen(tempfolder) + 27];
generatefilename(filename);
int rv;
int n = 1;
int received = 0;
char buffer[BUFFER_SIZE];
FILE *p = NULL;
fd_set set;
char response[768];
struct timeval timeout;
timeout.tv_sec = 360;
timeout.tv_usec = 0;
FD_ZERO(&set);
FD_SET(sock, &set);
bzero(buffer, BUFFER_SIZE);
bzero(response, sizeof response);
rv = select(sock + 1, &set, NULL, NULL, &timeout);
if (rv == -1)
{
error("error on select in handleinput");
close(sock);
exit(1);
}
else if (rv == 0)
{
close(sock);
exit(0);
}
else
{
n = read(sock, buffer, BUFFER_SIZE-1);
if (n <= 0)
{
close(sock);
exit(0);
}
}
// open file
if (n != 0)
{
p = fopen(filename, "a");
if (p == NULL)
{
error("ERROR writing message to file");
close(sock);
exit(1);
}
}
// loop until full message is received
while (n != 0)
{
if (n < 0)
{
error("ERROR reading from socket");
close(sock);
exit(1);
}
received = 1;
// write content to file
fwrite(buffer, strlen(buffer), 1, p);
if (buffer[strlen(buffer)-1] == 0x1c)
{
break;
}
bzero(buffer, BUFFER_SIZE);
rv = select(sock + 1, &set, NULL, NULL, &timeout);
if (rv == -1)
{
error("ERROR select in loop in handleinput");
close(sock);
exit(1);
}
else if (rv == 0)
{
close(sock);
exit(0);
}
else
{
n = read(sock, buffer, BUFFER_SIZE-1);
}
}
// close file if we opened it earlier
if (p != NULL)
{
fclose(p);
}
// send acknowledgement back to client
if (received == 1)
{
generateResponse(response, filename);
n = write(sock, response, strlen(response));
if (n < 0)
{
error("ERROR writing to socket");
close(sock);
exit(1);
}
}
}