मुझे यह समस्या भी थी। आपके पास फाइल हैंडल रिसाव है। आप (इसे POSIX सिस्टम पर) सभी खुले फ़ाइल हैंडल की एक सूची मुद्रण द्वारा इस डिबग कर सकते हैं:
void showFDInfo()
{
s32 numHandles = getdtablesize();
for (s32 i = 0; i < numHandles; i++)
{
s32 fd_flags = fcntl(i, F_GETFD);
if (fd_flags == -1) continue;
showFDInfo(i);
}
}
void showFDInfo(s32 fd)
{
char buf[256];
s32 fd_flags = fcntl(fd, F_GETFD);
if (fd_flags == -1) return;
s32 fl_flags = fcntl(fd, F_GETFL);
if (fl_flags == -1) return;
char path[256];
sprintf(path, "/proc/self/fd/%d", fd);
memset(&buf[0], 0, 256);
ssize_t s = readlink(path, &buf[0], 256);
if (s == -1)
{
cerr << " (" << path << "): " << "not available";
return;
}
cerr << fd << " (" << buf << "): ";
if (fd_flags & FD_CLOEXEC) cerr << "cloexec ";
// file status
if (fl_flags & O_APPEND ) cerr << "append ";
if (fl_flags & O_NONBLOCK) cerr << "nonblock ";
// acc mode
if (fl_flags & O_RDONLY ) cerr << "read-only ";
if (fl_flags & O_RDWR ) cerr << "read-write ";
if (fl_flags & O_WRONLY ) cerr << "write-only ";
if (fl_flags & O_DSYNC ) cerr << "dsync ";
if (fl_flags & O_RSYNC ) cerr << "rsync ";
if (fl_flags & O_SYNC ) cerr << "sync ";
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_whence = 0;
fl.l_start = 0;
fl.l_len = 0;
fcntl(fd, F_GETLK, &fl);
if (fl.l_type != F_UNLCK)
{
if (fl.l_type == F_WRLCK)
cerr << "write-locked";
else
cerr << "read-locked";
cerr << "(pid:" << fl.l_pid << ") ";
}
}
सभी खुली फ़ाइलों आप जल्दी से यह पता लगाने जाएगा जहां अपनी फ़ाइल हैंडल रिसाव है बाहर डंपिंग के द्वारा।
यदि आपका सर्वर subprocesses spawns। जैसे यदि यह एक 'कांटा' शैली सर्वर है, या यदि आप अन्य प्रक्रियाओं (जैसे सीजीआई के माध्यम से) उत्पन्न कर रहे हैं, तो आपको वास्तविक फाइलों और सॉकेट दोनों के लिए "क्लॉएक्सैक" के साथ अपनी फ़ाइल हैंडल बनाना सुनिश्चित करना होगा।
क्लॉएक्सैक के बिना, हर बार जब आप कांटा या स्पॉन करते हैं, तो सभी खुले फ़ाइल हैंडल बाल प्रक्रिया में क्लोन किए जाते हैं।
नेटवर्क सॉकेट को बंद करने में असफल होना भी वास्तव में आसान है - उदा। रिमोट पार्टी डिस्कनेक्ट होने पर बस उन्हें छोड़ दें। यह पागल की तरह रिसाव संभाल जाएगा।
स्रोत
2013-05-21 15:42:06
मैं संपादित /etc/security/limits.conf के साथ संपादित करता हूं: – linjunhalida
उपयोगकर्ता नाम हार्ड nofile 20000 – linjunhalida