Új hozzászólás Aktív témák
-
jattila48
aktív tag
válasz
jattila48 #20030 üzenetére
Közben éppen az általad linkelt Wikipédia cikkben megtaláltam, hogy a
waitid
-del visszakaphatod mind a 4 byte-ot. Tehát valóban a többi wait* fv. az, amelyik lecsonkolja az exit kódot. Így méginkább igaz, hogy a main fv.-nek semmi köze a csonkoláshoz, ez nem az ő speciális viselkedése. -
jattila48
aktív tag
válasz
jattila48 #20029 üzenetére
A PHP exec visszatérési értékén a 3. argumentumát értem. A PHP értelemben vett visszatérési értéke az stdout-ra írt utolsó sor (ami egyébként a 2. argumentum utolsó eleme is lesz) sztringként. A 3. argumentumban kapom vissza az exe program visszatérési értékét, ezért értem azt az "igazi" visszatérési értéknek. Bocs, ha esetleg zavarosan fogalmaztam.
-
jattila48
aktív tag
válasz
disy68 #20016 üzenetére
Továbbra is fenntartom, hogy a main fv. semmiben sem speciális, nem hívja meg (legalábbis magától) az exit-et, és nem csonkolja az int visszatérési értékét. Egyébként a linkereknek megadhatod, hogy mi legyen a belépési pont, a main csupán a default. Ahogy az előző hozzászólásomban írtam, az exit végülis valóban meg lesz hívva, de nem a main, hanem a main fv.-t hívó entitás (RTL, libc,...) fogja azt meghívni. Leegyszerűsítve nagyjából így:
exit(main(...));
Amikor a rendszer egy processzt kerál (pl. a shell), akkor CreateProcess rendszerhívással hozza létre (Windowsban) az exe fájlból. Először az exe-hez linkelt Startup (RTL, libc) fv. indul el, amely különböző inicializálások után meghívja a main fv.-t, majd annak visszatérési értékével (ha a main nem hívott explicite exit-et), az exit rendszerhívást. A processz indító entitás, pedig WaitForSingleObject-tel várakozik a processz befejeződésére, ami az exit végrehajtásával következik be. Az exit által kreált exit kódot a GetExitCodeProcess hívásával szerzi meg. Windows-ban semmi különös nem történik, visszakapom a 4 bájtos visszatérő értéket. Linux-on azonban, vagy az exit, vagy a wait* fv. (valószínűleg az utóbbi) 8 bitre csonkolja azt. Hogy ez a viselkedés POSIX szabvány-e vagy nem, azt nem tudom (újabban valószínűleg nem az), de mindenesetre semmiképpen nem a main fv. specialitása.
Az IPC módokat ismerem (kb. 30 éve programozok), szerintem az most itt nem releváns.
"A standard out-ra kerülő adat a visszatérési érték a php shell_exec és exec függvényénél is "
Ez szerintem nem így van, az exec visszatérési értéke (exec 3. argumentuma) a hívott exe program visszatérési értéke (amit végül is az exit->wait* állít elő), az stdout-ra írt értékeket pedig az exec 2. argumentumában kapom vissza tömbben. -
jattila48
aktív tag
válasz
jattila48 #20014 üzenetére
Közben beledebuggoltam a programba (Windows alatt, Linux-on még nem), és a rendszer (Windows RTL, Linuxon libc) a main meghívása után valóban meghívja az exit fv.-t, aminek a main-ből return-nel visszaadott értéket adja át. Az exit ezt az értéket lehet, hogy Linux-on 8 bitre csonkolja, Windows-on nem. Vagyis szerintem itt lesz a kutya elásva, az exit-nél. Akkor is meg lesz hívva (a libc által), ha a main-ből return-nel térek vissza. Minden esetre az továbbra is igaz, hogy ez nem a main fv. specialitása. A válaszokat köszönöm, probléma felderítve. Most már legalább ezt is tudom. Igaz rá ment egy napom, hogy kiderítsem, linuxon miért nem működött a PHP szkriptem.
A Windows max. 499-es visszatérési értéke mellékszál, de azért még érdekel. Ha tudtok róla bővebbet, kérlek ne tartsátok magatokban. -
jattila48
aktív tag
válasz
sztanozs #20012 üzenetére
Azt tudom, hogy az int mérete általában rendszerfüggő. Engem most csak az intel x86 és x64 rendszerek érdekelnek, ezeken az int 4 byte hosszú. Nem hiszem, hogy egy int f() -ként definiált fv. csak úgy lecsonkolná a visszatérési értékét 8 bitre. Márpedig az int main(int, char **) fv. éppen olyan közönséges fv., mint bármelyik, nem lehet olyan speciális tulajdonsága, hogy a return-nel visszaadott int értéket 8 bitre csonkolja. Szerintem a kutya máshol van elásva. Az OK, hogy az exit lecsonkolja az argumentumaként kapott int-et 8 bitre (legalábbis Linuxon), de a return biztos, hogy nem. Windows-ban biztos, hogy nincs is így, mert ahogy említettem, a CreateProcess => WaitForSingleObject => GetExitCodeProcess API hívás sorozattal a végén megkapom mind a 4 byte-ot. Linux-on vagy az exit lehet a "bűnös", de mivel ezt nem használom, akkor a parent process által hívott valamelyik wait* fv., vagy a PHP valóban bash-on keresztül hívja a programot, és akkor a bash lesz a hunyó. De nagyon valószínű, hogy ez nem a main fv. lényegi viselkedése.
Azt, hogy "POSIX rendszerekben a visszatérési érték 0-255 között lehet" hogy érted? Minek a visszatérési érétékét mondod? A main fv.-ét? Nem hinném, hogy a POSIX ilyet állítana (legalábbis igen csodálkoznék rajta).
Amit Windows-ról írtatok, hogy a maximális exit kód 499, ilyenről még nem hallottam, pedig igen régóta programozok Windowst. Nem lehet, hogy ez valami hiba család maximális értéke, amit pl. a GetLastError ad vissza (a GetLastError ennél egyébként nagyobb értékekekt is vissza szokott adni).
-
jattila48
aktív tag
válasz
disy68 #20009 üzenetére
Akkor nem vagyok tisztában az exit kód fogalmával, de most sem lett világosabb. Végülis pontosan mi akkor az exit kód? Windows-ban biztos, hogy vissza lehet adni return-nel a main fv.-ből 499-nél nagyobb értéket is, ilyet már csináltam (pl. CreateProcess => WaitForSingleObject => GetExitCodeProcess ). Az lehet, hogy az exit fv. lecsonkolja az int értéket, de windowsban miért 499-ig, miért nem 255-ig ? A main fv. visszatérési értéke miért int (Linuxban is), ha nem tud 4 byte-os egész értéket visszaadni?
Egyáltalán nem biztos, hogy a main fv.-ből bármit is ki akarok írni az stdout-ra, viszont szeretném pl. batch-ből meghívni, és a visszatérési értékével kezdeni valamit. Ez sokkal egyszerűbb, mint stdout-ra írni, aztán valahogy ezt visszaolvasni. Egyébként ezt a konkrét problémát megoldottam másképp (nem adok vissza 256-ot). -
jattila48
aktív tag
válasz
disy68 #20002 üzenetére
Hogy mit jelent a program visszatérési értéke, az azon múlik, hogy az őt meghívó PHP szkript hogy értelmezi ezt az értéket. A lényeg az, hogy a program 4 byte-os intet ad vissza, amit a php feltehetőleg már csak 1 karakterként lát. A kérdés az, hogy ez miért van így. Ha az exec a bash közbeiktatásával hívja a programot, akkor megvan a magyarázat, mert a bash csak karakternyi egész értéket ad vissza. Csakhogy a dokumentáció nem ezt állítja. A shell_exec PHP fv. az, amely a shell segítségével hívja az adott programot. A Windows cmd-ben tudtommal nincs ilyen korlátozás, hogy maximum 499-et adhat vissza egy batch program. Nem tudom, erre gondoltál-e.
-
jattila48
aktív tag
Sziasztok!
Abszolút kezdő vagyok PHP-ban, és nem is szándékozom magam továbbképezni. Mindössze annyi történt, hogy írtam egy C programot, ami int értéket ad vissza. Ezt a programot exec-cel meghívtam egy PHP szkriptből (Linux rendszerről van szó), aminek a visszatérési értékétől függően folyt a további PHP feldolgozás. Ha a program 256-ot adott vissza, azt a PHP olybá vette, mintha 0-t kapott volna. Olyan, mintha karaktert adnék vissza, ami túlcsordul. Persze nem ezt akartam. Mi lehet a hiba oka? Fiam szerint az lehet, hogy a PHP exec a bash-on keresztül hívja a programot, a bash pedig csak karakternyi egész értéket tud visszaadni. Ez elég meggyőzőnek hangzik, azonban a PHP dokumentációjában erről nincs szó. A Windows esetében írja, hogy a cmd-n keresztül hívja a programot, de a Linuxról nem ír ilyet. Egyébként WAMP-on úgy működik, ahogy vártam.
-
jattila48
aktív tag
válasz
jattila48 #19444 üzenetére
Közben azt hiszem rájöttem, mi a hiba.
$files=array_diff(scandir($dir),array('..','.'));
utasítás a file név tömbből kiveszi az első két elemet, a . és .. neveket, ezért a 0 és 1 index érvénytelen. Érdekes ez a PHP, nekem még elég szokatlan (C, C++ -hoz vagyok szokva). -
jattila48
aktív tag
válasz
cidalain #19442 üzenetére
A
$file=explode(".",$files[$i]);
sorra írja, hogy
Notice: Undefined offset: 0 in index.php on line 24
amikor az i értéke 0. Vagyis a tömb indexszel van baja, pedig a files változóban egy directory fájl nevei vannak, és van előtte egy
if($i<sizeof($files)){
$file=explode(".",$files[$i]);
}ellenőrzés is.
De ez csak notice, amit elnyomok, és úgy már jó. -
jattila48
aktív tag
Sziasztok!
Hogy lehet azt Apache/PHP-ban megcsinálni, hogy a HTTP headeren kívül csak a lekért file tartalmát adja vissza, mindenféle HTML sallang nélkül. Most nekem mindenféle font beállításokat, titlét és egyéb HTML tag-eket is visszaad, mielőtt magát a fájl tartalmát megkapnám. Nem böngészőtől fogja kapni a kérést, ezért semmit nem kell majd megjeleníteni, csak a fájl tartalmára van szüksége a kliensnek.
Új hozzászólás Aktív témák
Hirdetés
- MSI GP66 Leopard 10UE 15.6" FHD IPS i7-10870H RTX 3060 16GB 512GB NVMe magyar vbill gar
- Új, makulkátlan Samsung Galaxy Tab S9 FE 6GB/128GB Szürke, 2 év garancia
- Komplett PC I7-12700KF RTX 4070 TI SUPER!
- IPhone 16 Plus 128GB One függő 2025.12.17. Apple jótállás
- IPhone 12 64GB gyári független szép új akku!!
- 14" Dell Latitude laptopok: 5400, 5480, 5490, 7480, E7440, E7450 / SZÁMLA + GARANCIA
- ÁRGARANCIA! Épített KomPhone Ryzen 7 9700X 32/64GB RAM RX 9070 16GB GAMER PC termékbeszámítással
- ÁRGARANCIA!Épített KomPhone i5 10600KF 16/32/64GB RAM RX 6600 8GB GAMER PC termékbeszámítással
- LG 65C3 - 65" OLED evo - 4K 120Hz 1ms - NVIDIA G-Sync - FreeSync Premium - HDMI 2.1 - PS5 és Xbox!
- Akciós Windows 10 / 11 Pro OEM Licenc Kulcs 100% eredeti, jogtiszta!
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest