abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    dnes 06:00 | Humor

    Programovací jazyk HTML.

    Ladislav Hagara | Komentářů: 0
    včera 23:00 | Upozornění

    Podpora TORu v Debianu 11 Bullseye a 10 Buster byla ukončena. Doporučuje se přechod na Debian 12 Bookworm.

    Ladislav Hagara | Komentářů: 0
    včera 22:33 | IT novinky

    Příkaz "opakuj donekonečna" je nově v rozporu s podmínkami používání ChatGPT. Příkaz vedl k prozrazení trénovacích dat [/.].

    Ladislav Hagara | Komentářů: 1
    včera 21:55 | Nová verze

    GNU Project Debugger aneb GDB byl vydán ve verzi 14.1. Podrobný přehled novinek v souboru NEWS. Vypíchnout lze podporu NO_COLOR a Debugger Adapter Protocol (DAP).

    Ladislav Hagara | Komentářů: 0
    včera 16:55 | Nová verze

    Byla vydána verze 5.0 webového aplikačního frameworku napsaného v Pythonu Django (Wikipedie). Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 16:44 | Nová verze

    TuxClocker je Qt GUI nástroj pro monitorování a nastavování (přetaktovávání) hardwaru na Linuxu. Aktuální verze je 1.4.0. Z novinek lze vypíchnout monitorování využití AMD a NVIDIA VRAM nebo sledování spotřeby energie procesorů AMD a Intel.

    Ladislav Hagara | Komentářů: 0
    3.12. 09:44 | Komunita

    O víkendu (15:00 až 23:00) probíhá EmacsConf 2023, tj. online konference vývojářů a uživatelů editoru GNU Emacs. Sledovat ji lze na stránkách konference. Záznamy jsou k dispozici přímo z programu.

    Ladislav Hagara | Komentářů: 8
    2.12. 17:44 | Komunita

    Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek i s náhledy aplikací v Týden v GNOME a Týden v KDE.

    Ladislav Hagara | Komentářů: 3
    1.12. 21:55 | Nová verze

    Organizace Apache Software Foundation (ASF) vydala verzi 20 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.

    Ladislav Hagara | Komentářů: 0
    1.12. 17:22 | Nová verze

    Desktopové prostředí Cinnamon, vyvíjené primárně pro distribuci Linux Mint, dospělo do verze 6.0. Seznam změn obsahuje především menší opravy a v říjnovém přehledu novinek v Mintu avizovanou experimentální podporu Waylandu.

    Fluttershy, yay! | Komentářů: 10
     (44%)
     (12%)
     (44%)
    Celkem 50 hlasů
     Komentářů: 1, poslední včera 22:13
    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: 459×
    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.