- Ismét egy "Idióta" A.I. Projekt, hogy meglovagolja az aktuális trendeket...
- Időutazás floppyval: A 486-os visszavág PCem-men
- AMD Ryzen 9 9900X (100-100000662WOF)+ Samsung 990 PRO 2TB MZ-V9P2T0BW
- Processzor és videokártya szilícium mag fotók újratöltve!
- Az e-sport napistenének ajándéka: Lamzu Inca gamer egér
- Magga: PLEX: multimédia az egész lakásban
- Mr.Csizmás: Bestbuy travel, utazós, kirándulós topic - szállások, jegyek
- sziku69: Fűzzük össze a szavakat :)
- leslieke: leslieke farmerzsebe
- laskr99: Processzor és videokártya szilícium mag fotók újratöltve!
- Luck Dragon: Asszociációs játék. :)
- gban: Ingyen kellene, de tegnapra
- No Voice in the Galaxy
- Rap, Hip-hop 90'
- GoodSpeed: AMD Ryzen 9 9900X (100-100000662WOF)+ Samsung 990 PRO 2TB MZ-V9P2T0BW
Hirdetés
Ú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
- GYÖNYÖRŰ iPhone 13 Pro Max 1TB Sierra Blue -1 ÉV GARANCIA, Kártyafüggetlen, MS3091, 94% Akkumulátor
- DELL PowerEdge R630 rack szerver - 2xE5-2650v3 (20 mag / 40 szál, 2.3/3.0GHz), 32GB RAM, 55992Ft+ÁFA
- LG 48C2 - 48" OLED EVO - 4K 120Hz 1ms - NVIDIA G-Sync - FreeSync Premium - HDMI 2.1 - A9 Gen5 CPU
- BESZÁMÍTÁS! Gigabyte B450M R5 5600 16GB DDR4 512GB SSD GTX 1080Ti 11GB ZALMAN I3 NEO Chieftec 650W
- Gamer PC- Számítógép! Csere-Beszámítás! I3 10100F / RTX 2060 / 32GB DDR4 / 500GB SSD
Állásajánlatok
Cég: FOTC
Város: Budapest