Laufendes Programm umbenennen unter GNU/Linux

badday

Erfahrenes Mitglied
Moin zusammen,

ich muss ein Programm umbenenne während es ausgeführt wird. Dabei kann ich unter Windows std::rename() verwenden, allerdings habe ich unter GNU/Linux das Problem, dass die Datei "gelockt" ist. Gibt es hier einen plattformspezifischen Weg, dies dennoch zu machen?

Vielen Dank,

Gruß,

badday
 
Hallo,

der Interesse halber: Bist du dir sicher? Ist es nicht eigentlich genau umgekehrt? Dass die Datei unter Windows gesperrt ist aber unter Linux nicht?

Gruß
BK
 
Moin,

ja, ich denke schon:

Any file that is executing on the computer system as a program (e.g., an EXE, COM, DLL, CPL or other binary program file format) is normally prevented by the file system from being opened for write or delete access, reporting a sharing violation, despite the fact that the program is not opened by any application. However, some access is still allowed. For example, a running application file can be renamed or copied (read) even when executing.
Quelle: http://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows

Gruß,

badday
 
Moin,

unter Windows ist das umbenennen problemlos möglich. Ich habe bereits eine Version mit einem zusätzlichen Programm, das eben das umbenennen übernimmt, will das aber alles in einem machen.
Gibt es vll. mit boost eine Möglichkeit soetwas zu machen?

Es könnte auch an den Zugriffsrechten liegen, hier steht nur root. Die Datei wird vom Programm selbst erstellt, daher wundert mich das etwas. Jedenfalls habe ich einfach mal naiv versucht, vor der Umbenennung chmod a+x anzuwenden, was aber nichts brachte.

Gruß,

badday
 
Hi.

Wie kommst du denn zu der Annahme, das die Datei gelockt ist? Linux lockt nichts implizit, wenn dann muß man z.b. flock oder fnctl benutzen. (und selbst das kann man ignorieren).

Evtl. solltest du mal den Ablauf erklären was das Programm macht / machen soll.

Welche Fehlermeldung gibt es denn beim umbenennen? (perror oder Exception?)

Schau evlt. mit strace oder einem Debugger was das Problem ist.

Gruß
 
Also ich bin mir relativ sicher, dass ich mit mv ein laufendes Programm umbenennen kann. Dass Linux irgendwelche laufenden Programme lockt, wäre mir jedenfalls neu.
 
Moin,

also das Programm macht folgendes: Das Programm (nennen wir es Updater) lädt die Datei (nennen wir sie toUpdate) herunter. Danach startet sie toUpdate, das wiederum Updater löscht und sich dann selbst in Updater umbenennt.

Zur Fehlermeldung: Es wird offenbar keine Exception geworfen, errno ist 26.
Wenn ich das ganze mit Boost versuche, so erhalte ich, dass die Datei "busy" sei. Kann es an den Zugriffsrechten liegen?

Gruß,

badday



#edit: Mit mv funktioniert es doch nicht. Auch hier erhalte ich "Text file busy".

Gruß,

badday
 
Zuletzt bearbeitet:
also das Programm macht folgendes: Das Programm (nennen wir es Updater) lädt die Datei (nennen wir sie toUpdate) herunter. Danach startet sie toUpdate, das wiederum Updater löscht und sich dann selbst in Updater umbenennt.
Und ist das erste Updater Programm schon beendet?
Zur Fehlermeldung: Es wird offenbar keine Exception geworfen, errno ist 26.
Wenn ich das ganze mit Boost versuche, so erhalte ich, dass die Datei "busy" sei. Kann es an den Zugriffsrechten liegen?
Nein.

Mach evtl. mal ein Minimalprogramm.

Gruß
 
Und ist das erste Updater Programm schon beendet?
Ja, es ist auch schon gelöscht.
Mach evtl. mal ein Minimalprogramm.
OK, ich versuche es mal:
Code:
string oldprogram="home/Updater";
string newprogram="/home/toUpdate";
int i = remove(oldprogram.c_str()); //funktioniert

		if( i != 0 ) 
		{
			cout<<"Error 11 "<<errno<<endl;			
			return -1;
		}


string renameLinux = "mv "+newprogram+" "+oldprogram;
system(renameLinux.c_str()); //funktioniert nicht

/*Funktioniert auch nicht:
if( rename(newprogram.c_str() , oldprogram.c_str()) != 0)
    {
        cout<<"Errorcode 12 "<<errno<<endl; //errno 26
        return -1;
    }
*/

Gruß,

badday
 
Zurück