2013-03-28 93 views
1

我的C/C++編寫日誌文件時遇到問題。 下面的代碼的一個例子發生問題嘗試寫入日誌文件時拒絕權限

EnterCriticalSection(&critical); 
printf("\nWaiting for a connection on TCP port %d (nbr of current threads = %d)...\n", pServer->TCPServerPort, (*pServer->lChildInfo)); 
AddLog("Waiting for a connection on TCP port %d (nbr of current threads = %d)...", pServer->TCPServerPort, (*pServer->lChildInfo)); 
LeaveCriticalSection(&critical); 

// creating variables to be passed to the thread 
struct*ThreadData = (struct*) malloc(sizeof(struct)); 
ThreadData->csock = (int*)malloc(sizeof(int)); 
memcpy(&ThreadData->pServer,&pServer,sizeof(pServer)); 

if((*ThreadData->csock = accept(pServer->ListenSocket, (SOCKADDR*)&sadr, &addr_size))!= INVALID_SOCKET){ 

    ThreadData->dwIP = sadr.sin_addr.s_addr; 
    ThreadData->wPort = sadr.sin_port; 

    printf("Received connection from %s:%d \n",inet_ntoa(sadr.sin_addr), ntohs(sadr.sin_port)); 
    AddLog("Received connection from %s:%d ",inet_ntoa(sadr.sin_addr), ntohs(sadr.sin_port)); 

AddLog是我爲了寫到文件寫的函數:

FILE *fichier = NULL; 
va_list ap; 
va_start(ap, log); 
//fichier = fopen("log.log","a"); 
fichier = _fsopen("log.log", "a", SH_DENYNO); 
if (fichier == NULL) 
    printf("Error log: %d (%s)\n", errno, strerror(errno)); 
else { 
    fprintf(fichier,":"); 
    vfprintf(fichier, log, ap); 
    fprintf(fichier,"\n"); 
    va_end(ap); 
    fclose(fichier);  
} 

我真的不能解釋的是,第一AddLog(「等待......」以及之前的所有文件)被正確寫入文件。但是,當我嘗試一個連接,日誌來(然後接收連接...)沒有寫入文件,我總是得到錯誤13「權限被拒絕」。 我使用chmod 777進入該文件,我也試過_fsopen函數,一旦進入線程,我仍然會得到這個錯誤。 如果有人有任何想法,這將是reaaally有幫助。 感謝所有

+0

向我們展示完整的示例程序,它可能有助於找到問題。 – user205993

+0

由於您的初始'AddLog()'調用由關鍵部分保護,我懷疑所有其他實例也應該如此。不知道這是否是你的問題,但它是* a *問題。另外,您可能應該將'va_start()'移動到'else'子句中的'AddLog()'內,否則匹配的'va_end()'可能永遠不會被調用 - 不管這個問題可能依賴於實現而已... – twalberg

回答

0

我不知道是否它的問題,但我會建議使用「a +」裏面的_fsopen 共享附加,因爲線程的另一個進程。

0

我不知道,如果它仍然是相關的,但我建議你用好一點的解決方案: (我前幾天遇到了同樣的問題和解決方案比瑣碎更多) 我只是執行一個共享隊列以及之後我添加到隊列中的所有日誌,我運行一個工作線程檢查隊列,並在隊列不爲空時寫入文件。

我希望它有助於有一個愉快的一天:)

相關問題