abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 14:33 | Nová verze

    Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.5 (Mastodon). Přehled novinek i s videi a se snímky obrazovek v oficiálním oznámení. Podrobný přehled v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    dnes 13:55 | IT novinky

    Rodina jednodeskových počítačů Orange Pi se rozrostla (𝕏) o Orange Pi 6 Plus.

    Ladislav Hagara | Komentářů: 0
    dnes 13:33 | IT novinky

    Na Humble Bundle běží akce Humble Tech Book Bundle: All Things Raspberry Pi by Raspberry Pi Press. Se slevou lze koupit elektronické knihy od nakladatelství Raspberry Pi Press a podpořit Raspberry Pi Press, Raspberry Pi Foundation North America nebo Humble.

    Ladislav Hagara | Komentářů: 0
    dnes 11:44 | Humor

    Přidaný režim autonomního řízení vozidel Tesla Mad Max je dostupný pro vybrané zákazníky v programu EAP (Early Access Program). Nový režim je na silnici agresivnější, častěji mění pruhy a ne vždy dodržuje rychlostní limity. Agentura JPP spekuluje, že v Česku by se mohl nový režim namísto Mad Max jmenovat Mad Turek...

    karkar | Komentářů: 12
    dnes 04:00 | Nová verze

    Byla vydána nová verze 9.18 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Nově také pro NanoPi R3S, R3S LTS, R76S a M5. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    dnes 00:22 | Nová verze

    bat, tj. vylepšený cat se zvýrazňováním syntaxe a integrací s gitem, byl vydán ve verzi 0.26.0.

    Ladislav Hagara | Komentářů: 1
    včera 19:33 | Nová verze

    Byla vydána první verze 0.0.1 [Mastodon] multipatformního renderovacího jádra webového prohlížeče Servo (Wikipedie). Vývoj Serva započal v roce 2012 v Mozilla Corporation. V roce 2020 bylo Servo předáno nadaci Linux Foundation. Servo je napsané v programovacím jazyce Rust.

    Ladislav Hagara | Komentářů: 1
    včera 15:11 | IT novinky

    Cloudovou službu Amazon Web Services (AWS) americké firmy Amazon dnes postihl globální výpadek. Omezil dostupnost řady aplikací a webů, například populární platformu Snapchat nebo aplikaci s prvky umělé inteligence (AI) Perplexity. Podle webu Downdetector hlásily problémy také uživatelé obchodu Amazon, streamovací platformy PrimeVideo nebo platební služby PayPal.

    Ladislav Hagara | Komentářů: 7
    včera 13:33 | Zajímavý software Ladislav Hagara | Komentářů: 0
    včera 12:44 | Pozvánky

    Od 3. do 16. listopadu proběhnou Dny AI 2025. V úterý 11. listopadu proběhne Open source AI day v Red Hatu v Brně.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (37%)
     (47%)
     (20%)
     (20%)
     (23%)
     (18%)
     (21%)
     (18%)
     (18%)
    Celkem 249 hlasů
     Komentářů: 14, poslední 14.10. 09:04
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Dotaz: Neúplný výstup na stdout při O_NONBLOCK stdin

    24.3.2008 01:04 martyone | skóre: 18
    Neúplný výstup na stdout při O_NONBLOCK stdin
    Přečteno: 510×
    Veselé velikonoce všem! :-)

    Můj problém je v ukázce kódu níže – jakmile nastavím stdin flag O_NONBLOCK, následující výstup na stdout se po chvíli zastaví a nehodlá pokračovat. Jakmile flag na stdin zruším, vše opět funguje jak má. Je to standardní chování? Dá se ovlivnit?

    Díky za každou reakci

    
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdio.h>
    
    
    int main(int argc, char** argv)
    {
    	int flags, i;
    	char foo[]=
    		"% 6d 012345678901234567890123456789012345678901234567890123456789\n";
    
    	// vypise se vse
    	for (i= 0; i < 10000; i++) printf(foo, i);
    
    	// vypise se
    	puts("\nklavesu...");
    	fgetc(stdin);
    
    	flags= fcntl(fileno(stdin), F_GETFL, 0);
    	fcntl(fileno(stdin), F_SETFL, flags | O_NONBLOCK);
    
    	// NEvypise se vse
    	for (i= 0; i < 10000; i++) printf(foo, i);
    
    	// NEvypise se ani tohle
    	puts("\n*** KONEC ***");
    
    	fcntl(fileno(stdin), F_SETFL, flags);
    
    	// tohle se uz vypise
    	puts("\nklavesu...");
    	fgetc(stdin);
    
    	// vypise se vse
    	for (i= 0; i < 10000; i++) printf(foo, i);
    
    	// vypise se
    	puts("\n*** KONEC ***");
    
    	return (0);
    }
    

    Odpovědi

    Luboš Doležel (Doli) avatar 24.3.2008 01:05 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Neúplný výstup na stdout při O_NONBLOCK stdin
    Střílím: nepomohlo by udělat flush na ten stdout?
    24.3.2008 19:34 martyone | skóre: 18
    Rozbalit Rozbalit vše Re: Neúplný výstup na stdout při O_NONBLOCK stdin
    Bohužel ne – to dělám v původním (C++) kódu, kde jsem se s tímto chováním setkal.
    24.3.2008 01:37 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: Neúplný výstup na stdout při O_NONBLOCK stdin
    24.3.2008 19:43 martyone | skóre: 18
    Rozbalit Rozbalit vše Re: Neúplný výstup na stdout při O_NONBLOCK stdin
    Musím se přiznat, že jsem nějak nenašel souvislost(?) …
    24.3.2008 20:48 Andrej Herceg | skóre: 43
    Rozbalit Rozbalit vše Re: Neúplný výstup na stdout při O_NONBLOCK stdin
    Pôvodne som si myslel, že je problém v tom, že aj rodičovskému procesu sa nastaví stdin na neblokujúci.

    Problém je pravdepodobne inde, ale vyzerá to tak, že je to s tým odkazom súvisí. Keď je zariadenie terminál, tak stdin, stdout a stderr je v podstate rovnaký súbor (pravdepodobne je file descriptor iba zduplikovaný) a zmena jedného na NONBLOCK zmení aj ostatné (aspoň ja som to tak pochopil).

    Na jednej stránke som našiel citát R. Stevensa z UNIX Network Programming Vol1, p.399
    using standard I/O with nonblocking descriptors, a recipe for disaster
    (ale celé som to nečítal, takže neviem, v čom je ten problém)

    Tento program dokazuje, že zmena stdin na neblokujúci, zmení aj stdout a stderr (aspoň u mňa).
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdio.h>
    
    
    int main(int argc, char** argv)
    {
    	int flags;
    
    	fprintf(stdout, "stdin: %s\n", (fcntl(fileno(stdin), F_GETFL, 0) & O_NONBLOCK) ? "NONBLOCK" : "BLOCK");
    	fprintf(stdout, "stdout: %s\n", (fcntl(fileno(stdout), F_GETFL, 0) & O_NONBLOCK) ? "NONBLOCK" : "BLOCK");
    	fprintf(stdout, "stderr: %s\n", (fcntl(fileno(stderr), F_GETFL, 0) & O_NONBLOCK) ? "NONBLOCK" : "BLOCK");
    
    	flags= fcntl(fileno(stdin), F_GETFL, 0);
    	fcntl(fileno(stdin), F_SETFL, flags | O_NONBLOCK);
    
    	fprintf(stdout, "stdin: %s\n", (fcntl(fileno(stdin), F_GETFL, 0) & O_NONBLOCK) ? "NONBLOCK" : "BLOCK");
    	fprintf(stdout, "stdout: %s\n", (fcntl(fileno(stdout), F_GETFL, 0) & O_NONBLOCK) ? "NONBLOCK" : "BLOCK");
    	fprintf(stdout, "stderr: %s\n", (fcntl(fileno(stderr), F_GETFL, 0) & O_NONBLOCK) ? "NONBLOCK" : "BLOCK");
    
    	fcntl(fileno(stdin), F_SETFL, flags);
    
    	return (0);
    }
    
    24.3.2008 21:37 martyone | skóre: 18
    Rozbalit Rozbalit vše Re: Neúplný výstup na stdout při O_NONBLOCK stdin
    Aha, děkuju :-)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.