🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
3 messages
3 total messages Started by Szyk Cech Sat, 09 Mar 2019 13:09
Dziwny wyciek zasobów
#72881
Author: Szyk Cech
Date: Sat, 09 Mar 2019 13:09
117 lines
5064 bytes
Witam

[WSTĘP]
Mam program w C++ oparty na bibliotece Qt. Generalnie program jest 
niezależny od systemu operacyjnego. Jednak z jakichś dziwnych względów 
biblioteka Qt nie ma możliwości operowania na datach plików i katalogów. 
Dlatego napisałem funkcję w oparciu o Api Linux-a realizującą kopiowanie 
dat plików. Jest to przydatne podczas kopiowania.

[PROBLEM]
Mam jakiś wyciek zasobów. W pewnym momencie operacja fopen się nie udaje 
(po całkiem sporej liczbie poprawnych operacji). Wg mnie wszystko 
powinno grać, ale błąd występuje.

[KOD]
Oto kod mojej funkcji:

void gCopyFileAtributes(QString aSource, QString aDest)
{
     if(!QFileInfo::exists(aSource))
         NOTIFY_EXCEPTION(QObject::tr("Source file does not exists: 
%1").arg(aSource), gLibraryId, eErrorCode::eFileSystemError);
     if(!QFileInfo::exists(aDest))
         NOTIFY_EXCEPTION(QObject::tr("Destination file does not exists: 
%1").arg(aDest), gLibraryId, eErrorCode::eFileSystemError);

     FILE* lSrc = fopen(aSource.toUtf8(), "r");
     if(!lSrc)
         NOTIFY_EXCEPTION(QObject::tr("fopen failed for file: %1: 
%2").arg(aSource).arg(strerror(errno)), gLibraryId, 
eErrorCode::eFileSystemError);

     FILE* lDest = fopen(aDest.toUtf8(), "w");
     if(!lDest)
     {
         fclose(lSrc);
         NOTIFY_EXCEPTION(QObject::tr("fopen failed for file: %1: 
%2").arg(aDest).arg(strerror(errno)), gLibraryId, 
eErrorCode::eFileSystemError);
     }

     struct stat lStat;
     if(fstat(fileno(lSrc),&lStat))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("fstat failed for file: %1: 
%2").arg(aSource).arg(strerror(errno)), gLibraryId, 
eErrorCode::eFileSystemError);
     }


     // Update to the same uid/gid
     if(fchown(fileno(lDest), lStat.st_uid,lStat.st_gid))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("fchown failed: 
%1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
     }

     // Update the permissions
     if(fchmod(fileno(lDest), lStat.st_mode))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("fchmod failed: 
%1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
     }

     // Change access time
     timeval lTimes[2];
     lTimes[0].tv_sec = lStat.st_atim.tv_sec;
     quint32 lUsecA(static_cast<quint32>(lStat.st_atim.tv_nsec / 1000));
     lTimes[0].tv_usec = lUsecA;

     // Change modification time
     lTimes[1].tv_sec = lStat.st_mtim.tv_sec;
     quint32 lUsecM(static_cast<quint32>(lStat.st_mtim.tv_nsec / 1000));
     lTimes[1].tv_usec = lUsecM;

     if(futimes(fileno(lDest), lTimes))
     {
         fclose(lSrc);
         fclose(lDest);
         NOTIFY_EXCEPTION(QObject::tr("futimes failed: 
%1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
     }

     fclose(lSrc);
     fclose(lDest);
}

[OPIS FUNCKCJI]
Jak widać wszystko tworzone jest na stosie z wyjątkiem 2 zmiennych lSrc 
i lDest. Jednak one są zawsze zwalniane i po za tym wyjątki nie są 
zgłaszane w trakcie wcześniejszej pracy.

[OPIS ZGŁASZANEGO BŁĘDU]
File: ../../../../Kopia3/Src/Libs/Common/Src/FileTools.Linux.cpp, in 
line: 26, in function: gCopyFileAtributes
Error code: 3, Error message: fopen failed for file: 
/tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI 
Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak dostępu
Exception occurs! Sender: Common.so, Error code: 3
Message:
File: ../../../../Kopia3/Src/Libs/Common/Src/FileTools.Linux.cpp, in 
line: 26, in function: gCopyFileAtributes
Error code: 3, Error message: fopen failed for file: 
/tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI 
Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak dostępu
Bug report has been sent...

Może ktoś doradzi jak prawidłowo powinna wyglądać ta funkcja?
dzięki i pozdro
Szyk Cech
Re: Dziwny wyciek zasobów
#72882
Author: Bogdan (bogdro)
Date: Thu, 14 Mar 2019 19:26
50 lines
3107 bytes
W dniu 09.03.2019 o 14:09, Szyk Cech pisze:
> 
> Witam
> 
> [WSTĘP]
> Mam program w C++ oparty na bibliotece Qt. Generalnie program jest
> niezależny od systemu operacyjnego. Jednak z jakichś dziwnych względów
> biblioteka Qt nie ma możliwości operowania na datach plików i
> katalogów. Dlatego napisałem funkcję w oparciu o Api Linux-a
> realizującą kopiowanie dat plików. Jest to przydatne podczas kopiowania.
> 
> [PROBLEM]
> Mam jakiś wyciek zasobów. W pewnym momencie operacja fopen się nie
> udaje (po całkiem sporej liczbie poprawnych operacji). Wg mnie
> wszystko powinno grać, ale błąd występuje.


Skoro nie wypowiedział się nikt bardziej kompetentny, to ja
powiedziałbym, że kod jest prawidłowy, a błąd:

[...]

> Error code: 3, Error message: fopen failed for file:
> /tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI
> Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak
> dostępu


 polega na braku dostępu do obiektu, czyli uprawnieniach (do samego
pliku lub jednego z zawierających go katalogów). Jak zrobisz w shellu
jako ten sam user

 cat '/tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++
GUI Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png'

 to działa?

 W każdym razie, gdybyś miał wyciek zasobów, to raczej spodziewałbym
się błędu typu "osiągnięto limit liczby otwartych plików" ("Too many
open files" lub "File table overflow").

 Po nieudanym fopen() wyświetl sobie też wartość globalnej zmiennej
"errno" i porównaj z wartościami: EPERM, ENFILE, EMFILE.


-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):            http://bogdro.evai.pl
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org www.TorProject.org  Soft(EN): http://bogdro.evai.pl/soft
Re: Dziwny wyciek zasobów
#72883
Author: Szyk Cech
Date: Sun, 24 Mar 2019 10:57
6 lines
1381 bytes
 >   polega na braku dostępu do obiektu, czyli uprawnieniach (do samego
 > pliku lub jednego z zawierających go katalogów). Jak zrobisz w shellu
 > jako ten sam user

Miałeś rację! Problem dotyczył praw pliku: kopiowałem plik z 
uprawnieniami r--r--r-- i chciałem go otworzyć do pisania.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads