J'essaie de déboguer un problème dans mon code. J'ai un processus A qui fonctionne continuellement jusqu'à ce que je lui demande d'arrêter.Gestion des fichiers laissés par le code C++ sous Linux
Inside AI procédez comme suit:
- montage partition/dev/sda1
open()
// crée un fichier vide Xwrite()
// écrire quelques octets ilclose()
// fermer le fichierprocessFile()
// Effectuer une opérationremove()
// supprimer le fichier- umount/dev/sda1
note I test après chaque opération ci-dessus si elle a réussi ou non befor aller de l'avant. Quand je fais lsof | grep A
il montre la poignée de fichier de X étant détenue par le processus A. Je vois aussi qu'il a un (supprimé). Cela m'empêche de démonter la partition. Pourquoi cela se passe-t-il et comment puis-je contourner ce problème?
EDIT: Merci à tous. Voici l'extrait du code:
tarFileDesc = _pSysCall->open("test.tar", O_CREAT | O_RDWR | O_APPEND, 0777);
if (0 > tarFileDesc)
return false;
... some logging here
// Write http stream to tar file, istr is an argument to my function
int read_buffer_size = 0;
buffer = new char[4096];
while (!istr.eof() && count < content_length)
{
if ((content_length - count) >= 4096)
read_buffer_size = 4096;
else
read_buffer_size = content_length - count;
memset(buffer, 0, 4096);
istr.read(buffer, read_buffer_size);
std::streamsize in_bytes = istr.gcount();
if (istr.fail() || istr.bad())
{
status = false;
break;
}
if (write(tarFileDesc, buffer, in_bytes) != in_bytes)
{
status = false;
break;
}
count += in_bytes;
}
// Cleanup buffer
delete[] buffer;
if ((0 > tarFileDesc) && (0 != close(tarFileDesc)))
return false;
if (0 != system("tar C /test -xvf test.tar"))
return false;
if (0 != remove("test.tar"))
return false;
Remarque J'ai même essayé de faire juste l'ouvrir, fermer et supprimer. Mais je vois toujours la poignée maintenue par processus.
Veuillez ajouter du code, pas de méta-code. Les problèmes de verrouillage ne peuvent généralement pas être résolus par méta-code. Réduire le code d'origine, puis nous pouvons essayer de le déboguer. – Thorsten79
Vous voyez le fichier handle du fichier X appartenant à votre processus * après * vous avez supprimé le fichier? Je ne suis pas un expert, mais cela semble étrange. Pourriez-vous emballer votre problème dans quelques lignes de code? – mkluwe
@mkluwe - Les UNIX prennent en charge ce comportement. Le même processus ou un processus différent peut supprimer le fichier alors qu'il est ouvert. Le fichier peut toujours être écrit à travers les poignées ouvertes, mais dès que toutes les poignées du fichier sont fermées, le fichier est supprimé. Toute tentative de nouvelle ouverture sur un fichier dans cet état est refusée. Donc, si le fichier n'est pas fermé complètement ou correctement dans le processus, ce serait valide. –