Zjištění chyby při neúspěchu fwrite()

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #60 kdy: 01. 07. 2018, 07:43:01 »
Výsledek je stejný.
V tom případě jste nezkoušel tu variantu s posix_get_last_error(), protože ta funkce vrací číslo, takže nemůže být výsledek stejný, jako když zavoláte variantu s funkcí error_get_last(), která vrací pole.

Pokud by vám i posix_get_last_error() vracela, že k žádné chybě nedošlo, máte smůlu, protože PHP mezitím zavolalo nějakou jinou POSIXovou funkci, která výsledek volání write() překryla.


Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #61 kdy: 01. 07. 2018, 07:58:43 »
Zapsání nula bytes chyba je
To je napsané kde?

Když se podíváte na ty příklady v manuálové stránce explain_write, neúspěšný zápise se tam rozpoznává tak, že návratový kód je menší než nula. Myslíte, že to v té manuálové stránce je špatně?

Jak jsem psal výše, něco takového by vedlo k busy loop a nesmyslnému aplikačnímu kódu.
Ne nutně. Nikdo netvrdí, že když write() vrátí nulu, musí ji vrátit i v příštím cyklu – v příštím cyklu už může být zápis úspěšnější a zapíše alespoň něco, nebo už se alespoň bude vědět příčina chyby a write() vrátí chybu plus třeba EAGAIN.
 write() může skončit úspěšně i v případě předchozí chyby, proto tam ty chybové kódy jsou, aby se aplikace mohla rozhodnout, co má zkusit znovu a jak (EAGAIN, EINTR, ENOSPC).

Na druhé straně je třeba říct, že dokumentace (citace je z Linux man page, nikoliv POSIX specifikace) by mohla být napsaná jasněji
V té manuálové stránce je jasně napsáno, že i při úspěšném volání se může vrátit nula. Ale mohlo by tam být explicitně napsáno, že se pak má volání opakovat, stejně jako pro jiné případy,když nebylo zapsáno vše. Dokumentace k jiným knihovnám tu nulu často neřeší vůbec.

V POSIX specifikaci jsem také nenašel nic o tom, že by nula byla chyba.

Lol Phirae

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #62 kdy: 01. 07. 2018, 08:30:39 »
...........

 ;D ;D ;D ;D ;D
 :D :D :D :D :D
 :P :P :P :P :P

Ladislav Michl

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #63 kdy: 02. 07. 2018, 12:55:29 »
Výsledek je stejný.
V tom případě jste nezkoušel tu variantu s posix_get_last_error()...

Jestli on tazatel nemyslí, že výsledek je stejný, tedy i s touto implementací mu došlo na disku místo ;-)

A. F.

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #64 kdy: 02. 07. 2018, 13:26:46 »
Výsledek je stejný.
V tom případě jste nezkoušel tu variantu s posix_get_last_error()...

Jestli on tazatel nemyslí, že výsledek je stejný, tedy i s touto implementací mu došlo na disku místo ;-)

Tak já myslím, že se od Filipa Jirsáka kromě siláckých řečí nic zajímavého nedozvím. Všechno mu to musím vysvětlovat po lopatě a nic z toho.

Tak jsem tam zatím jen upravil hlášku, kontroluju místo na disku pomocí disk_free_space(). Nic lepšího asi nevymyslíme.

Kdyby někoho ještě napadl nějaký způsob, třeba nějaká zahrabaná globální proměnná, nebo tak něco.


Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #65 kdy: 02. 07. 2018, 14:42:22 »
Tak já myslím, že se od Filipa Jirsáka kromě siláckých řečí nic zajímavého nedozvím. Všechno mu to musím vysvětlovat po lopatě a nic z toho.
Dozvěděl jste se, kde máte v kódu chybu, proč je to chyba a jak jí opravit. Vysvětlovat jste nic nemusel, naopak jste na mnohé dotazy odpovídal až na několikátý pokus, případně vůbec. Vaše „výsledek stejný“ má k vyčerpávajícímu popisu chyby opravdu velmi daleko – i mnozí uživatelé chápou, že musí napsat, co přesně dělali a jaký byl výsledek. Pro programátora by to měla být úplná samozřejmost.

KStanley

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #66 kdy: 02. 07. 2018, 14:59:18 »
Já teda obdivuju trpělivost pana Jirsáka s tazatelem a několika individui jako Lol Phirae a BoneFlute. Já osobně bych se už na jakoukoliv pomoc vy..., protože tazatel není schopen přečíst a porozumět psanému textu, nápodobně BoneFlute, který nepřinese jediný faktický argument, který by dokázal, že pan Jirsák nemá pravdu a jen tu sprostě uráží. Pánové, fakt nechápu smysl Vašeho počínání, tohle fórum má sloužit k výměně zkušeností a Vy informace a rady ignorujete.

Ladislav Michl

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #67 kdy: 02. 07. 2018, 15:02:20 »
Kdyby někoho ještě napadl nějaký způsob, třeba nějaká zahrabaná globální proměnná, nebo tak něco.

Zahrabaná globální proměnná se jmenuje errno, kód tady máte, někteří si dokonce dali práci a našli, jak je implementované fwrite() a Vy se omezíte na "výsledek je stejný". To mi nepřijde příliš motivující. Obtěžovalo by Vás napsat, co vrací fwrite() poté, co dojde místo a co obsahuje errno?

L.

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #68 kdy: 02. 07. 2018, 15:38:44 »
To je zas diskuse. Připomíná mi to jistou scénu ze Ztráty třídní knihy... Jeden se zeptá a pak nadává lidem, co se mu snaží poradit. Druhý sofistikovaně teoretizuje z manuálu, zdrojáku, ale že by ho napadlo si svoji radu prakticky vyzkoušet, to ne. Udělal jsem to tedy za vás. Kód:

Kód: [Vybrat]
<?php
        
echo "PHP VERSION: ".phpversion()."\n";

        
$FILE_NAME '/my_small_partition/test';

        
$s '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
        
$len strlen($s);

        
$file fopen($FILE_NAME 'w');
        for(;;) {
                
$wrote fwrite($file$s);
                if (
$wrote <= 0) {
                        
$stored_posix_get_last_error posix_get_last_error();
                        
$stored_error_get_last error_get_last();
                        
$stored_errno $errno;
                        echo 
"wrote: ";
                        
var_dump($wrote);
                        echo 
"errno: ";
                        
var_dump($stored_errno);
                        echo 
"posix_get_last_error: ";
                        
var_dump($stored_posix_get_last_error);
                        echo 
"error_get_last: ";
                        
var_dump($stored_error_get_last);
                        break;
                }
        }
        
fclose($file);
        
unlink($FILE_NAME);
?>


Výsledek:

Kód: [Vybrat]
PHP VERSION: 7.0.18-0ubuntu0.16.04.1
PHP Notice:  Undefined variable: errno in test.php on line 15
wrote: int(0)
errno: NULL
posix_get_last_error: int(0)
error_get_last: NULL

(Padá to opravdu na zaplnění disku. Chyby si nejdřív uložím do proměnných aby nedošlo k volání knihovny při echo.)

No a včil mudrujte.

Lol Phirae

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #69 kdy: 02. 07. 2018, 15:58:00 »
Já myslim že tam máš málo cyklů... 

 ;D
 ;D ;D
 ;D ;D ;D
 ;D ;D
 ;D

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #70 kdy: 02. 07. 2018, 16:55:02 »
Druhý sofistikovaně teoretizuje z manuálu, zdrojáku, ale že by ho napadlo si svoji radu prakticky vyzkoušet, to ne. Udělal jsem to tedy za vás.
Udělal jste to za tazatele. Když má spoustu blbých keců a ani neumí napsat, co vyzkoušel, nemíním si kvůli němu ještě instalovat PHP a něco zkoušet.

L.

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #71 kdy: 02. 07. 2018, 17:12:46 »
Udělal jste to za tazatele. Když má spoustu blbých keců a ani neumí napsat, co vyzkoušel, nemíním si kvůli němu ještě instalovat PHP a něco zkoušet.

Být tebou Jirsák, tak mlčím a šoupu nohama, protože se právě ukázalo, že jsi tu celou dobu velkohubě radil hovadiny.

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #72 kdy: 02. 07. 2018, 17:44:38 »
Být tebou Jirsák, tak mlčím a šoupu nohama, protože se právě ukázalo, že jsi tu celou dobu velkohubě radil hovadiny.
Mohl byste být přesnější, co z toho, co jsem radil, byla hovadina? Tazatel měl špatně napsaný zápis do souboru, to jsem mu poradil, jak opravit – ten původní kód by fungoval jedině tehdy, kdyby se jedním voláním fwrite() podařilo zapsat všechna data bez chyby. Ve všech ostatních případech by ten kód dělal nesmysly. Dále jsem tazateli poradil, že až si kód opraví tak, aby opravdu detekoval selhání fwrite(), ať vyzkouší, zda přesnou chybu nezjistí z funkcí posix_get_last_error() nebo error_get_last(). Že to doteď tazatel nevyzkoušel nebo nenapsal výsledek toho pokusu, za to nemůžu. A povinnost zkoušet to za tazatele fakt nemám, už tak dostal mnohem lepší rady, než by si svým chováním zasloužil.

Lol Phirae

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #73 kdy: 02. 07. 2018, 19:33:36 »
Mohl byste být přesnější, co z toho, co jsem radil, byla hovadina?

Možná bude jednodušší popsat, co z "rad" hovadina nebyla... To si ušetříme hodně práce.  ;D

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #74 kdy: 02. 07. 2018, 21:33:41 »
Tazatel měl špatně napsaný zápis do souboru, to jsem mu poradil, jak opravit – ten původní kód by fungoval jedině tehdy, kdyby se jedním voláním fwrite() podařilo zapsat všechna data bez chyby. Ve všech ostatních případech by ten kód dělal nesmysly.
Na což se neptal, nesouviselo to s tím na co se ptal, a ani to nijak nepomohlo s jeho problémem. Rada na nic.

Dále jsem tazateli poradil, že až si kód opraví tak, aby opravdu detekoval selhání fwrite(), ať vyzkouší, zda přesnou chybu nezjistí z funkcí posix_get_last_error() nebo error_get_last(). Že to doteď tazatel nevyzkoušel nebo nenapsal výsledek toho pokusu, za to nemůžu.
Což udělal, a podle jeho reakcí soudě vyzkoušel. Že tvrdíš, že to nevyzkoušel, že tvrdíš, že to nenapsal, přestože to má uvedené hned v prvním příspěvku - to už je tvůj problém. A tvá drzost.

A povinnost zkoušet to za tazatele fakt nemám, už tak dostal mnohem lepší rady, než by si svým chováním zasloužil.
Jaký chování? Že není spokojený s radou, která prostě nefunguje? Když by se všichni chovali jako on, tak by bylo krásně na foru.

Víš, problém jsi tu ty, ne ostatní.