Hozzászólások
-
SzerzőBejegyzés
-
nanobit wrote:Akkor valaki el tudná mondani, hogy hogyan lenne helyesen? Lehetőleg olyasvalaki aki nem hurrog le, mert kezdő vagyok…
Az az igazság, hogy ha nem érted mit írtam, most nem is fogod. A C nyelv memória kezelését hetek, de inkább hónapok alatt lehet megtanulni.
nanobit wrote:még csak néhány napja próbálgatom a c++-tRossz hírem van. Nem C++ nyelven próbálkozol. Ez van.
Így lenne helyesen (C++):
Code:std::string fajlnev;
char *home;home = getenv(„HOME”);
if (home == NULL)
throw MyException(„A $HOME környezeti változó tartalma ismeretlen!”);
fajlnev = home;
fajlnev +=”/.kde/Autostart/valami.sh”;
try {
std::ofstream sfile (fajlnev);
}
catch (…)
throw MyException(„Hiba a fájl megnyitása közben”);
sfile << szoveg;
sfile.close();chmod(fajlnev.c_str(), S_IXUSR);
nanobit wrote:még csak néhány napja próbálgatom a c++-tRossz hírem van. Nem C++ nyelven próbálkozol. Ez van.
Így lenne helyesen (C++):
Code:std::string fajlnev;
char *home;home = getenv(„HOME”);
if (home == NULL)
throw MyException(„A $HOME környezeti változó tartalma ismeretlen!”);
fajlnev = home;
fajlnev +=”/.kde/Autostart/valami.sh”;
try {
std::ofstream sfile (fajlnev);
}
catch (…)
throw MyException(„Hiba a fájl megnyitása közben”);
sfile << szoveg;
sfile.close();chmod(fajlnev.c_str(), S_IXUSR);
nanobit wrote:Gabaman!Jelen!
nanobit wrote:Te most a char *home-ra gondolsz?Az egy váltzó. Az getenv() függvényre gondoltam, ez ad vissza fix méretű tömböt.
nanobit wrote:Csak megjegyzem, hogy gond nélkül hozzáfűzte a futtatas változó tartalmához.Tehát a számítógép sem működhet, mert még senki sem látott elektronokat futkározni, vagy csak nem köszöntek vissza. Kérdezd meg Valgrind pajtást, jobban tudja mindenkinél mi jó és mi nem.
nanobit wrote:A probléma ott kezdődik, hogy az első hozzáfűzéskor, mikor a chmod +x-et fűzöm hozzá a futtatas-hoz, ami mindaddig üres volt, bevág nekem az elejére 2 vagy 3 kérdőjelet.Lásd „inicializálatlan változó”.
nanobit wrote:Ehhez még hozzájön a char mutatós home karaktertömb tartalma, ami hibátlanul hozzáfűződik, viszon a system nem tud mit kezdeni a paranccsal, mert a ???chmod +x nem futtatható…Hidd csak el, a szabadság sok nyűggel és felelőssggel jár. A C fordító nem jelzi a helytelen mutató használatból eredő hibákat.
nanobit wrote:Gabaman!Jelen!
nanobit wrote:Te most a char *home-ra gondolsz?Az egy váltzó. Az getenv() függvényre gondoltam, ez ad vissza fix méretű tömböt.
nanobit wrote:Csak megjegyzem, hogy gond nélkül hozzáfűzte a futtatas változó tartalmához.Tehát a számítógép sem működhet, mert még senki sem látott elektronokat futkározni, vagy csak nem köszöntek vissza. Kérdezd meg Valgrind pajtást, jobban tudja mindenkinél mi jó és mi nem.
nanobit wrote:A probléma ott kezdődik, hogy az első hozzáfűzéskor, mikor a chmod +x-et fűzöm hozzá a futtatas-hoz, ami mindaddig üres volt, bevág nekem az elejére 2 vagy 3 kérdőjelet.Lásd „inicializálatlan változó”.
nanobit wrote:Ehhez még hozzájön a char mutatós home karaktertömb tartalma, ami hibátlanul hozzáfűződik, viszon a system nem tud mit kezdeni a paranccsal, mert a ???chmod +x nem futtatható…Hidd csak el, a szabadság sok nyűggel és felelőssggel jár. A C fordító nem jelzi a helytelen mutató használatból eredő hibákat.
nanobit wrote:Sziasztok! Sajnos csak nem régóta tudok foglalkozni a C++ rejtelmeivel.nanobit wrote:char *home;home = getenv(„HOME”);
strcat(home,”/.kde/Autostart/valami.sh”);No igen, ilyen szőrnyűségek akkor keletkeznek, amikor valaki C++ stílusban akar C nyelven programozni. A „char*” visszatérési típus nem sztringet ad vissza (mint a C++ std::string típusa), hanem karakterlánccal feltöltött fix méretű memóriatömböt. Így nem fűzhetsz hozzá semmit, mert a lefoglalt memória utáni területre fogsz írni. Mellesleg a 40 byte hosszú tömb nem bizos, hogy elég. Ha meg nincs ellenőrzés a getenv() után, akkor lehet hogy a gyökér könyvtárba fogsz írni…
Code:char futtatas[100]=””;
char fajlnev[100]=””;
char *home;home = getenv(„HOME”);
if (home == NULL) {
printf(„A $HOME környezeti változó tartalma ismeretlen!”);
return FALSE;
}
strcat(fajlnev,home);
strcat(fajlnev,”/.kde/Autostart/valami.sh”);
sfile=fopen(fajlnev,”w+”);
fputs(szoveg,sfile);
fclose(sfile);strcat(futtatas,”chmod +x „);
strcat(futtatas,fajlnev);
system(futtatas);nanobit wrote:Sziasztok! Sajnos csak nem régóta tudok foglalkozni a C++ rejtelmeivel.nanobit wrote:char *home;home = getenv(„HOME”);
strcat(home,”/.kde/Autostart/valami.sh”);No igen, ilyen szőrnyűségek akkor keletkeznek, amikor valaki C++ stílusban akar C nyelven programozni. A „char*” visszatérési típus nem sztringet ad vissza (mint a C++ std::string típusa), hanem karakterlánccal feltöltött fix méretű memóriatömböt. Így nem fűzhetsz hozzá semmit, mert a lefoglalt memória utáni területre fogsz írni. Mellesleg a 40 byte hosszú tömb nem bizos, hogy elég. Ha meg nincs ellenőrzés a getenv() után, akkor lehet hogy a gyökér könyvtárba fogsz írni…
Code:char futtatas[100]=””;
char fajlnev[100]=””;
char *home;home = getenv(„HOME”);
if (home == NULL) {
printf(„A $HOME környezeti változó tartalma ismeretlen!”);
return FALSE;
}
strcat(fajlnev,home);
strcat(fajlnev,”/.kde/Autostart/valami.sh”);
sfile=fopen(fajlnev,”w+”);
fputs(szoveg,sfile);
fclose(sfile);strcat(futtatas,”chmod +x „);
strcat(futtatas,fajlnev);
system(futtatas);tovis wrote:Ami a már bootolódó/betolt kernelt illeti ott már sok mindent meg lehettenni, pl. van az scsidev ami papírforma szerint „makes permanent SCSILUN -> devicename connections” – jól hangzik nem?„Tartósan létrehozza az SCSI LUN -> eszköznév hozzárendeléseket”. Szerintem jól hangzik, mert erre van szükséged.
tovis wrote:No mindegy, egy szónak is száz a vége, biztos hogy valahogy meglehet oldani, de ami ilyen bonyolult az már nem lessz eléggé megbízható – szerintem.Valószínűleg nem vetted észre, de több megoldást is írtam. A legegyszerűbb a bootCD + fstab címkék páros, így nem kell foglalkozni az SCSI dolgokkal.
tovis wrote:Ami a már bootolódó/betolt kernelt illeti ott már sok mindent meg lehettenni, pl. van az scsidev ami papírforma szerint „makes permanent SCSILUN -> devicename connections” – jól hangzik nem?„Tartósan létrehozza az SCSI LUN -> eszköznév hozzárendeléseket”. Szerintem jól hangzik, mert erre van szükséged.
tovis wrote:No mindegy, egy szónak is száz a vége, biztos hogy valahogy meglehet oldani, de ami ilyen bonyolult az már nem lessz eléggé megbízható – szerintem.Valószínűleg nem vetted észre, de több megoldást is írtam. A legegyszerűbb a bootCD + fstab címkék páros, így nem kell foglalkozni az SCSI dolgokkal.
tovis wrote:Kitől kérem be az aktuális boot ID -t? – automatikus boot kell.Csak tudod melyik vinyóra telepítetted az OS-t. Minden vinyónak van sorozatszáma, ami a /proc/scsi/scsi fájlban látszik. Ezt automatikusan meg lehet keresni.
tovis wrote:Ki fogja végrehajtani az általad leírt parancsot és mikor?Mivel a boot lemezen van, és /sbin/init a neve, ezért a kernel indítja, ahányszor bootolsz a CD-ről.
tovis wrote:Ráadásul (lehet hogy nem említettem?) Debian netinst -el előfordult, hogy megcserélte a SCSI ID -t bootoláskor (van egy SCSI hdd és bvan egy SATA hdd a gépben). Ha leállítoma gépet (poweroff) és kisvágtatva újra indítom akkor megint visszaáll! – mi ez, wos? Ha ilyen előfordul akkor az fstab is borul – /home és a többi
Egyébként nem tudom mit fog csinálni egy rendszer ha mondjuk /dev/sdb1 ként volt telepítve és /dev/sda1 -ként ébresztik?Tehát minden bootolás alkalmával kiszámíthatatlan az SCSI vezérlőhöz rendelt azonostó (scsi0 vagy scsi1). Erre a megoldás a „LABEL” használata az fstab-ban (man fstab).Az e2label paranccsal megadod a partíció címkéjét (pl, root), majd a mount és a grub szépen megkeresi hol is van a partíció. Bár a régebbi Debianok nem támogatják, sajna. Ha van e2label valamelyik csomagban, akkor működni fog.
Persze ez nem oldja meg a bootolást, de ha van egy behúzott kernel, akkor már menni fog. Mellesleg USB flash-ről is lehet bootolni, ha a BIOS támogatja.
# e2label /dev/sda1 root
/etc/fstab (részlet):
LABEL=root / ext3 defaults 1 1 -
SzerzőBejegyzés
