Linux C下fdopen的问题
cnpxm 2010-11-01 02:33:01 void LogManage::GetIndex(void)
{
if(!m_bOpen)
{
ReadIndex();
}
printf("Current log file: [%s] \n", m_ppFileList[m_nIndex]);
}
void LogManage::Clean()
{
Close();
for(int i = 0; i < FILE_COUNT; ++i)
{
m_fdLog = open(m_ppFileList[i], O_RDWR | O_TRUNC | O_CREAT, 0666);
close(m_fdLog);
}
m_fdIndex = open(m_pIndexFile, O_RDWR | O_TRUNC | O_CREAT, 0666);
int nTemp = 0;
write(m_fdIndex, &nTemp, sizeof(nTemp));
write(m_fdIndex, &nTemp, sizeof(nTemp));
write(m_fdIndex, &nTemp, sizeof(nTemp));
close(m_fdIndex);
}
LogManage::LogManage(): FILE_COUNT(3), MAX_LINE_COUNT(200), m_bOpen(false), m_nIndex(0), m_fdLog(-1), m_fdIndex(-1), m_nLogTimer(0), m_nLineCount(0)
{
}
LogManage::~LogManage()
{
Close();
}
bool LogManage::Open(void)
{
if(m_bOpen)
{
return true;
}
if(!ReadIndex())
{
return false;
}
bool bRet = true;
m_fdLog = open(m_ppFileList[m_nIndex], O_CREAT | O_RDWR, 0x666);
if(-1 == m_fdLog)
{
printf("Open file %s FAILED! Errno: %d", m_ppFileList[m_nIndex], errno);
m_bOpen = false;
bRet = false;
}
else
{
m_fStream = fdopen(m_fdLog, "a+"); // "a+" means append
if(NULL == m_fStream)
{
printf("fdopen failed! Line: %d\n", __LINE__);
}
char pBuf[100];
sprintf(pBuf, "\n\n\n******************************* %d *****************\n\n\n", m_nLogTimer);
fputs(pBuf, m_fStream);
fflush(m_fStream);
m_nLogTimer++;
m_bOpen = true;
printf("Open file %s successfully!", m_ppFileList[m_nIndex]);
bRet = WriteIndex();
}
return bRet;
}
bool LogManage::Close(void)
{
bool bRet = true;
if(m_bOpen)
{
if(!WriteIndex())
{
error("Write index file error! error no: %d", errno);
bRet = false;
}
bRet = bRet && (-1 != close(m_fdLog));
m_bOpen = false;
fclose(m_fStream);
}
return bRet;
}
void LogManage::LogOut(const char* pMsg, ...)
{
const unsigned int MAX_BUFFER = 300;
const char* NEW_LINE = "\n";
if(NULL == pMsg)
{
return;
}
va_list args;
va_start(args, pMsg);
char pBuffer[MAX_BUFFER];
va_end(args);
if(!m_bOpen)
{
Open();
}
int nLen = vfprintf(m_fStream, pMsg, args);
m_nLineCount++;
if(m_nLineCount >= 50)
{
WriteIndex();
}
fputc('\n', m_fStream);
if(m_nLineCount >= MAX_LINE_COUNT)
{
close(m_fdLog);
// fclose(m_fStream);
m_nIndex = (m_nIndex + 1) % FILE_COUNT;
m_fdLog = open(m_ppFileList[m_nIndex], O_CREAT | O_TRUNC | O_WRONLY, 0666);
if(-1 == m_fdLog)
{
printf("open file failed! Line: %d\n", __LINE__);
}
m_nLineCount = 0;
/* why NOT work??????
* m_fStream = fdopen(m_fdLog, "a+"); // "a+" means append
if(NULL == m_fStream)
{
printf("fdopen failed! Line: %d\n", __LINE__);
}
*/
/* why NOT work?????
char pBuf[100];
sprintf(pBuf, "\n\n\n******************************* %d *****************\n\n\n", m_nLogTimer); // Indicate the file sequence
fputs(pBuf, m_fStream);
fflush(m_fStream);
*/ fprintf(m_fStream, "\n\n\n******************************* %d *****************\n\n\n", m_nLogTimer); // Indicate the file sequence
fflush(m_fStream);
WriteIndex();
}
fflush(m_fStream);
fdatasync(m_fdLog);
}
bool LogManage::WriteIndex(void)
{
m_fdIndex = open(m_pIndexFile, O_RDWR);
if(-1 == m_fdIndex) // open fail, maybe haven't been created
{
printf("Index file %s dose NOT exists! \n", m_pIndexFile);
return false;
}
else // open successfully
{
bool bRet = true;
lseek(m_fdIndex, 0, SEEK_SET);
bRet = bRet && (-1 != write(m_fdIndex, &m_nIndex, sizeof(m_nIndex))); // write m_nIndex
bRet = bRet && (-1 != write(m_fdIndex, &m_nLineCount, sizeof(m_nLineCount))); // write m_nLineCount
bRet = bRet && (-1 != write(m_fdIndex, &m_nLogTimer, sizeof(m_nLogTimer))); // write m_nLogTimer
fdatasync(m_fdIndex);
bRet = bRet && (-1 != close(m_fdIndex)); // close index file
return bRet;
}
}
bool LogManage::ReadIndex(void)
{
bool bRet = true;
m_fdIndex = open(m_pIndexFile, O_RDWR);
if(-1 == m_fdIndex) // open fail, maybe haven't been created
{
printf("Index file %s dose NOT exists! Create it!\n", m_pIndexFile);
m_fdIndex = open(m_pIndexFile, O_CREAT | O_RDWR, 0666);
if(-1 == m_fdIndex)
{
error("Create index file %s FAILED! Errno: %d", m_pIndexFile, errno);
bRet = false;
}
else
{
int nTemp = 0;
bRet = bRet && (-1 != write(m_fdIndex, &nTemp, sizeof(m_nIndex)));
bRet = bRet && (-1 != write(m_fdIndex, &nTemp, sizeof(m_nLineCount)));
bRet = bRet && (-1 != write(m_fdIndex, &nTemp, sizeof(m_nLogTimer)));
fdatasync(m_fdIndex);
m_nIndex = 0;
m_nLineCount = 0;
m_nLogTimer = 0;
}
}
else // open successfully
{
lseek(m_fdIndex, 0, SEEK_SET);
if(read(m_fdIndex, &m_nIndex, sizeof(m_nIndex)) < sizeof(m_nIndex) ||
read(m_fdIndex, &m_nLineCount, sizeof(m_nLineCount)) < sizeof(m_nLineCount) ||
read(m_fdIndex, &m_nLogTimer, sizeof(m_nLogTimer)) < sizeof(m_nLogTimer))
{
error("Read index file %s FAILED! Errno: %d", m_pIndexFile, errno);
bRet = false;
}
}
bRet = bRet && (-1 != close(m_fdIndex));
return bRet;
}
上面用红色标记的两个地方,在重新打开m_fStream的时候总是返回-1,为什么呢?前提是我已经close过了。