Laufendes Programm umbenennen unter GNU/Linux

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;
    }
*/
Ich meinte ein vollständiges Programm welches man kompilieren und ausführen kann und bei dem man den Fehler dann auch nachvollziehen kann. :rolleyes:

Das Geschreibsel da hast du doch bestimmt nicht in der Form ausprobiert, oder?! Und wenn doch, hast du nicht gesagt wie man den Fehler nachvollziehen kann. (muss man evtl. vorher eine Datei anlegen? ;-])

Gruß
 
OK, ich hoffe es funktioniert:

Code:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>

using namespace std;


int main( int argc, char *argv[])
{
   cout<<"Neuer Name:"<<endl;
   string newname; //complete path!
   cin>>newname;

   string oldname =  argv[0];

   string renameLinux = "mv "+oldname+" "+newname;
    system(renameLinux.c_str());

    return 0;
}

Gruß,

badday
 
Hallo badday,

dein Programm funktioniert bei mir ohne Probleme:
Code:
reima@marvin:/tmp/test$ ls
test.cpp
reima@marvin:/tmp/test$ g++ -o alt test.cpp 
reima@marvin:/tmp/test$ ls
alt  test.cpp
reima@marvin:/tmp/test$ ./alt 
Neuer Name:
/tmp/test/neu
reima@marvin:/tmp/test$ ls
neu  test.cpp
reima@marvin:/tmp/test$

Der Umweg über system ist allerdings nicht nötig, verwende stattdessen rename:

C++:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>

using namespace std;


int main( int argc, char *argv[])
{
   cout<<"Neuer Name:"<<endl;
   string newname; //complete path!
   cin>>newname;

   if (rename(argv[0], newname.c_str()) != 0) {
      perror("rename");
      return EXIT_FAILURE;
   }

   return EXIT_SUCCESS;
}

Grüße,
Matthias
 
Zuletzt bearbeitet:
Moin,

bei mir geht es nach wie vor nicht. Ich erhalte auch mit deiner Version: "rename: Text file busy".

Geht das obige Programm bei noch jemanden? Bzw. woran kann es liegen, dass es bei mir nicht geht?

Gruß,

badday
 
Hi.
Moin,

bei mir geht es nach wie vor nicht. Ich erhalte auch mit deiner Version: "rename: Text file busy".

Geht das obige Programm bei noch jemanden? Bzw. woran kann es liegen, dass es bei mir nicht geht?
Zeig uns erstmal genau was du machst. Wie hast du denn das Programm aufgerufen und was hast du eingegeben?

Gruß
 
Moin,

hier ist, was ich mache (das erste war noch mit mv, das zweite mit rename):

badday@badday-virtualdesktop:~$ '/home/badday/tut'
Neuer Name:
/home/badday/new
mv: cannot move `/home/badday/tut' to `/home/badday/new': Text file busy
badday@badday-virtualdesktop:~$ '/home/badday/tut'
Neuer Name:
/home/badday/new
rename: Text file busy
badday@badday-virtualdesktop:~$

Gruß,

badday
 
/home/badday/new ist der neue Name.

Ja, ich führe das in einer virtuellen Maschine aus.

Gruß,

badday
 
strace sagt:

Code:
badday@badday-virtualdesktop:~$ strace '/home/badday/tut' 
execve("/home/badday/tut", ["/home/badday/tut"], [/* 34 vars */]) = 0
brk(0)                                  = 0x2474000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeecb2000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=71034, ...}) = 0
mmap(NULL, 71034, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fefeeca0000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\244\5\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1044112, ...}) = 0
mmap(NULL, 3223608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fefee781000
mprotect(0x7fefee877000, 2097152, PROT_NONE) = 0
mmap(0x7fefeea77000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf6000) = 0x7fefeea77000
mmap(0x7fefeea80000, 81976, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fefeea80000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libm.so.6", O_RDONLY)        = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360>\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=534832, ...}) = 0
mmap(NULL, 2629864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fefee4fe000
mprotect(0x7fefee580000, 2093056, PROT_NONE) = 0
mmap(0x7fefee77f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x81000) = 0x7fefee77f000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200-\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=92552, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeec9f000
mmap(NULL, 2188280, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fefee2e7000
mprotect(0x7fefee2fd000, 2093056, PROT_NONE) = 0
mmap(0x7fefee4fc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7fefee4fc000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\355\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1568136, ...}) = 0
mmap(NULL, 3676200, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fefedf65000
mprotect(0x7fefee0dd000, 2097152, PROT_NONE) = 0
mmap(0x7fefee2dd000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x178000) = 0x7fefee2dd000
mmap(0x7fefee2e2000, 18472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fefee2e2000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeec9e000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeec9c000
arch_prctl(ARCH_SET_FS, 0x7fefeec9c720) = 0
mprotect(0x7fefee2dd000, 16384, PROT_READ) = 0
mprotect(0x7fefee4fc000, 4096, PROT_READ) = 0
mprotect(0x7fefee77f000, 4096, PROT_READ) = 0
mprotect(0x7fefeea77000, 28672, PROT_READ) = 0
mprotect(0x601000, 4096, PROT_READ)     = 0
mprotect(0x7fefeecb4000, 4096, PROT_READ) = 0
munmap(0x7fefeeca0000, 71034)           = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeecb1000
write(1, "Neuer Name:\n", 12Neuer Name:
)           = 12
fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeecb0000
read(0, /home/badday/new
"/home/badday/new\n", 1024)     = 17
brk(0)                                  = 0x2474000
brk(0x2495000)                          = 0x2495000
rename("/home/badday/tut", "/home/badday/new") = -1 ETXTBSY (Text file busy)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fefeecaf000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(3, "rename: Text file busy\n", 23rename: Text file busy
) = 23
close(3)                                = 0
munmap(0x7fefeecaf000, 4096)            = 0
exit_group(1)                           = ?

Gruß,

badday
 
Zurück