Hirdetés
- Xiaomi 15T - reakció nélkül nincs egyensúly
- Milyen okostelefont vegyek?
- Garmin Forerunner 965 - csúcs
- Beépül a Nano Banana a Google Fotókba
- Motorola Edge 70 - többért kevesebbet
- Samsung Galaxy A54 - türelemjáték
- Google Pixel topik
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Honor 200 - kétszázért pont jó lenne
- Fotók, videók mobillal
Ú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
- DELL Latitude 5310 13.3" FHD 2in1 Touchscreen laptop I5-10310U 16G/512G Win11 Pro, Üzletből, 27%ÁFÁs
- XIAOMI Redmi Note 14 Pro 5G 8/256
- POINT S WINTER S 185/65R15 88T téligumi acélfelnivel
- ThinkPad 15,6",core i3 6100u(4x2,3Ghz)IntelHD VGA,8-16GB RAM,240SSD,Jó akku,nagyon szép állapot
- 12700kf,RTX4060 8gb,32gb ddr5,6T m.2 ssd,stb .Új komplett középkategóriás gamer pc .
- MSI NVIDIA GeForce RTX 3090 3X OC GPU Kitűnő állapotban
- HPE Aruba switch, 48G PoE+, 4SFP+, L3, Smart managed
- Bomba ár! Lenovo ThinkPad T495 - AMD Ryzen 5 PRO I 8GB I 256GB SSD I 14" FHD I Cam I W11 I Gari!
- Csere-Beszámítás! Gamer Notebook! MSI Thin 15 B12UC! I5 12450H / RTX 3050 / 16GB DDR4 / 512GB SSD!
- Microsoft Surface Laptop 5 i5-1245U 16GB 512GB 13.5" Gorilla Glass TouchScreen 1 év garancia
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: NetGo.hu Kft.
Város: Gödöllő


