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 »
Citace od: andreaw.fean kdy 30. 06. 2018, 23:36:16
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 »
Citace od: kvr kvr kdy 01. 07. 2018, 05:30:18
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ě?

Citace od: kvr kvr kdy 01. 07. 2018, 05:30:18
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).

Citace od: kvr kvr kdy 01. 07. 2018, 05:30:18
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 »

Ladislav Michl

Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #63 kdy: 02. 07. 2018, 12:55:29 »
Citace od: Filip Jirsák kdy 01. 07. 2018, 07:43:01
Citace od: andreaw.fean kdy 30. 06. 2018, 23:36:16
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 »
Citace od: Ladislav Michl kdy 02. 07. 2018, 12:55:29
Citace od: Filip Jirsák kdy 01. 07. 2018, 07:43:01
Citace od: andreaw.fean kdy 30. 06. 2018, 23:36:16
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 »
Citace od: andreaw.fean kdy 02. 07. 2018, 13:26:46
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 »
Citace od: andreaw.fean kdy 02. 07. 2018, 13:26:46
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:


<?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:


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 »
Citace od: L. kdy 02. 07. 2018, 15:38:44
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 »
Citace od: Filip Jirsák kdy 02. 07. 2018, 16:55:02
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 »
Citace od: L. kdy 02. 07. 2018, 17:12:46
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 »
Citace od: Filip Jirsák kdy 02. 07. 2018, 17:44:38
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

  • *****
  • 2 155
Re:Zjištění chyby při neúspěchu fwrite()
« Odpověď #74 kdy: 02. 07. 2018, 21:33:41 »
Citace od: Filip Jirsák kdy 02. 07. 2018, 17:44:38
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.

Citace od: Filip Jirsák kdy 02. 07. 2018, 17:44:38
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.

Citace od: Filip Jirsák kdy 02. 07. 2018, 17:44:38
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í.