Hirdetés
- Okosóra és okoskiegészítő topik
- Samsung Galaxy A54 - türelemjáték
- Bemutatkozott a Poco X7 és X7 Pro
- Google Pixel topik
- Ekkor startol és ennyit gyártanak a Galaxy TriFoldból
- Fotók, videók mobillal
- Samsung Galaxy S25 - végre van kicsi!
- Megtartotta Európában a 7500 mAh-t az Oppo
- Mobil flották
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
Ú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
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- Milyen processzort vegyek?
- Autós kamerák
- CURVE - "All your cards in one." Minden bankkártyád egyben.
- Assetto Corsa Rally
- Gitáros topic
- Okosóra és okoskiegészítő topik
- iPhone-t használók OFF topikja
- Mibe tegyem a megtakarításaimat?
- Samsung Galaxy A54 - türelemjáték
- További aktív témák...
- Szép állapotú Wireless Xbox Stereo Headset
- Ryzen 7 5800X3D + Strix B550-A + 32GB Corsair Dominator + RX 7900 XTX NITRO+ 24G + 1200W 80+ plat
- HP ZBook Fury G8 - RTX A3000 - ajándék dokkolóval és laptop hűtővel
- Heatkiller Tube 100 D5 - full extra
- Gigabyte AORUS 17 - i7-12700H - RTX 3070 Ti - 32GB RAM - 1TB M2 SSD -FHD 360H- eredeti csomagolásban
- Silvercrest Rajztábla
- S. Mario PC! Hogy fusson a Super Mario! I5 14400F / RX 6900XT 16GB / 32GB DDR5 / 1TB SSD
- Gamer PC-Számítógép! Csere-Beszámítás! R5 8400F / RX 6800 16GB / 32GB DDR5 / 1TB SSD
- iPhone 13 Pro 128GB Gold -1 ÉV GARANCIA - Kártyafüggetlen, MS3963, 100% Akkumulátor
- Bomba ár! Lenovo ThinkPad T490s - i5-8GEN I 8GB I 256SSD I 14" FHD Touch I Cam I W11 I Gari!
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest


