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í
×
    včera 05:55 | Komunita

    O víkendu probíhá v Praze na Karlově náměstí 13 konference Installfest 2026. Na programu je celá řada zajímavých přednášek a workshopů. Vstup na konferenci je zcela zdarma, bez nutnosti registrace. Přednášky lze sledovat i online na YouTube.

    Ladislav Hagara | Komentářů: 4
    včera 05:22 | Komunita

    Mozilla a společnost Mila oznámily strategické partnerství za účelem rozvoje open source a suverénní AI. Cílem je ukázat, že open source AI může konkurovat uzavřeným systémům. Obě organizace chtějí posílit technologickou suverenitu a snížit závislost na hrstce velkých technologických firem.

    Ladislav Hagara | Komentářů: 3
    včera 04:00 | Humor

    Adam Rice předvedl, že pomocí DNS lze distribuovat a spustit kompletní hru DOOM. Rozdělil WAD soubory a binárky do téměř 2000 DNS záznamů v Cloudflare zóně (jeden TXT záznam v DNS může nést okolo 2000 znaků textu). Ty pak stáhl PowerShellem, dekomprimoval a spustil přímo v paměti počítače bez nutnosti zápisu na disk, což prakticky dokazuje, že DNS může sloužit jako distribuované úložiště dat a možný kanál pro načítání kódu. Repozitář projektu je na GitHubu.

    NUKE GAZA! 🎆 | Komentářů: 3
    27.3. 13:00 | Komunita

    Dnes a zítra probíhají Arduino Days 2026. Na programu je řada zajímavých přednášek. Sledovat je lze od 17:00 na YouTube. Zúčastnit se lze i lokálních akcí. Dnes v Poličce v městské knihovně a zítra v Praze na Matfyzu.

    Ladislav Hagara | Komentářů: 9
    27.3. 12:11 | Nová verze

    Byla vydána beta verze Ubuntu 26.04 LTS s kódovým názvem Resolute Raccoon. Přehled novinek v poznámkách k vydání. Dle plánu by Ubuntu 26.04 LTS mělo vyjít 23. dubna 2026.

    Ladislav Hagara | Komentářů: 1
    27.3. 02:22 | Komunita Ladislav Hagara | Komentářů: 11
    26.3. 23:22 | Komunita

    Ubuntu plánuje v budoucích verzích nahradit tradiční nástroje pro synchronizaci času (chrony, linuxptp a gpsd) novým, v Rustu napsaným ntpd-rs, který nabídne vyšší bezpečnost a stabilitu.

    Ladislav Hagara | Komentářů: 3
    26.3. 22:33 | Nová verze

    Byla vydána nová verze 7.6 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Správce hesel KeePassXC byl nahrazen správcem hesel GNOME Secrets. Bitcoinová peněženka Electrum byla povýšena na verzi 4.7.0. Tor Browser byl povýšen na verzi 15.0.8. Další novinky v příslušném seznamu.

    Ladislav Hagara | Komentářů: 1
    26.3. 11:33 | Zajímavý článek

    Chris Down v obsáhlém článku „vyvrací mýty o zswap a zram“, vysvětluje, co vlastně dělají a jaké jsou mezi nimi rozdíly. Doporučuje vyhýbat se zram na serveru a bez OOM.

    |🇵🇸 | Komentářů: 1
    26.3. 11:22 | IT novinky

    Porota v Los Angeles shledala firmy Google a Meta odpovědnými v přelomovém soudním sporu, který se týká závislosti na sociálních sítích; firmy musí zaplatit odškodné tři miliony dolarů (63,4 milionu Kč). Společnosti, které s verdiktem nesouhlasí, čelily obvinění, že své sociální sítě a platformy záměrně navrhly tak, aby si na nich děti vypěstovaly závislost. Porota došla k závěru, že technologické společnosti při navrhování a

    … více »
    Ladislav Hagara | Komentářů: 15
    Které desktopové prostředí na Linuxu používáte?
     (15%)
     (7%)
     (1%)
     (12%)
     (30%)
     (2%)
     (5%)
     (1%)
     (14%)
     (24%)
    Celkem 1172 hlasů
     Komentářů: 27, poslední 17.3. 19:26
    Rozcestník

    Dotaz: fork()

    26.2.2008 12:46 pepa
    fork()
    Přečteno: 604×
    DD,

    mam nasledujici kod
    int main(void){
      pid_t id;
      printf("tento text se vypíše dvakrát");
      if ((id = fork()) == 0) { /* synovský proces */
        putchar('\n');
      } else
        if (id > 0) { /* otcovský proces */
      putchar('\n');
      } else {
       perror("fork"); return 1; /* chyba při fork() */
      }
      return 0;
    }
    
    chtel bych vedet, jaktoze se funkce printf provede 2x? moje myslenka je, ze po vytvoreni procesu jak parent tak child pokracuji dale v programu.

    Odpovědi

    26.2.2008 12:50 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: fork()
    Ne. V procesu potomka se provádí až to, co následuje za návratem z fork().
    26.2.2008 18:51 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: fork()
    Omlouvám se. Moje odpověď je sice správná, ale na jinou otázku. Nevšiml jsem se, že se neptáte, jestli se ta funkce volá dvakrát, ale proč se zdá, jako by se volala dvakrát.
    26.2.2008 13:48 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: fork()
    Tak tohle je dost dobrej vtip :-) (ne jako že si děláš srandu, ale že je to zajímavý chování)

    Standardní výstup je jako normální soubor. Zapisuje se do něj pomocí volání syscallu kernelu. To je ovšem drahý, takže se to, co se má vypsat, nejdřív cachuje do paměti a až potom se to najednou vypíše. Funce libc, které pracují s FILE*, prostě nejdřív cachují do paměti a až když tam pošleš znak konce řádku, tak se to odpálí syscallem do kernelu. (Proto taky ty funkce pracují se strukturou FILE a ne rovnou s číselným deskriptorem.)

    Takže co se stane - do té cache uložíš ten text, ale ten se ve skutečnosti nikam nevypíše. Pak rozmnožíš ten proces, takže teď každý proces má svou vlastní verzi cache s tím textem. A v obou procesech ji celou odpálíš tím znakem '\n'.

    Je to evidentní z výpisu programu strace -f.
    26.2.2008 13:51 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: fork()
    Řešení: za printf vložit fflush(stdout); nebo dát do printf znak konce řádku (\n).
    26.2.2008 19:10 kvido
    Rozbalit Rozbalit vše Re: fork()
    Ono je to evidentní spíš z manuálové stránky, kterou bych rozhodně každému doporučil k prostudování, než se do forkování pustí. Je to méně bolestné, než podrobnosti zjišťovat "za běhu", což říkám z vlastní zkušenosti.
    27.2.2008 07:14 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: fork()
    man stdout? Číst zrovna tuhle manuálovou stránku by mě na jeho místě asi taky nenapadlo. I když úplně nejlepší je si přečíst všechny manuálový stránky :-)
    27.2.2008 08:44 kvido
    Rozbalit Rozbalit vše Re: fork()
    Překvapivě man fork :-). Stejné chování může nastat pro libovolný soubor, nejde o žádnou specialitu stdout.
    27.2.2008 10:33 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: fork()
    V mé debianní man fork toho moc není. Že při forku se používá copy-on-write se tam píše, ale že se data před zápisem souboru cachují, že té cow metodě podléhá i ta cache a že to může dělat takové chyby se tam nepíše, což je myslím si přesně ta informace, kterou tazatel potřeboval vědět. I to, že zděděné filedeskriptory sdílejí informaci o pozici v souboru se v manuálových stránkách píše taky bůhví kde. Když chci programovat pro Linux, tak prostě nestačí tipnout si název příkazu a přečíst si jen jeho man stránku, bohužel.
    27.2.2008 10:39 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: fork()
    (Samozřejmě je blbost, aby se man fork zabývala všemi detaily I/O a ostatních subsystémů jenom proto, že se to dá forknout. Jenom chci prostě říct, že to v man fork není :-) A poslední větu nemyslím nijak útočně a ani proti někomu.)
    27.2.2008 11:09 kvido
    Rozbalit Rozbalit vše Re: fork()
    Pokud chci interpretovat informaci o kopírování file deskriptorů, musím vědět, co to je file deskriptor a jak se používá, jinak má taková informace samozřejmě zanedbatelnou hodnotu. Takže jitě, jen manuálová stránka fork nestačí, pokud neznám vše, co se v ní odkazuje.

    Já jsem původně hlavně reagoval na to, že mechanismus "dvojitého výpisu" je patrný ze strace, což může vyvolávat dojem (můj dojem, neříkám, že to někdo tvrdí), jako by bylo vhodné nebo nutné to tímto způsobem zkoumat a dělat na základě toho nějaké závěry. Co tvrdím já je, že jde o chování zcela odpovídající standardu (POSIX), které je na většině systémů předvídatelné, byť se na něj nedá spoléhat (např. protože standard použití vyrovnávací paměti nevynucuje). V tomto kontextu je uváděné tvrzení, že pomůže fflush nebo vypsání nového řádku před forkem, nesprávné, neboť odpovídá pouze pozorování na konkrétním systému. Může existovat jiný systém, kde vypsání nového řádku zmíněný efekt nemá (pro fflush to je normou vyžadováno).
    27.2.2008 11:17 petris
    Rozbalit Rozbalit vše Re: fork()
    Mel by to spis vedet z hlavy protoze printf je standardni funkce C a chovani streamu se popisuje snad v kazde ucebnici C.
    27.2.2008 09:14 Tom.š Ze.le.in | skóre: 21 | blog: tz
    Rozbalit Rozbalit vše Re: fork()
    Teď nemám kde to zkusit, ale může se něco podobného stát na úrovni cache "uvnitř jádra" (např. při použití TCP_CORK)?
    27.2.2008 09:32 kvido
    Rozbalit Rozbalit vše Re: fork()
    Netuším co je TCP_CORK "uvnitř jádra", nicméně si troufnu odpovědět. Nejde o žádnou magii, ale chování vyplývající z toho, že fork kopíruje (mimo jiné) file deskriptory rodiče do potomka. Toto je popsáno a je třeba to vědět a ošetřit podle toho, co přesně je požadováno. Časté je, že před voláním fork se volá flush (aby později nedošlo ke zde zmíněnému dvojitému vypsání obsahu vrovnávací paměti) a první akce, kterou potomek provede, je zavření zděděných deskriptorů. Zpět k dotazu - pokud je to správně naprogramované, žádný dvojitý výpis apod. nehrozí. Předpokládejme, že v jádře je to správně naprogramované.
    27.2.2008 12:23 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: fork()
    Mám dojem, že si pletete FILE z libc a file descriptor procesu z jadra.

    Situace před forkem:
    PID User space              | Kernel space
    1   FILE *stream1 → int fd1 --→ int kfd1
    
    Situace po forku:
    PID User space              | Kernel space
    1   FILE *stream1 → int fd1 -+→ int kfd1
    2   FILE *stream1 → int fd1 -+ 
    
    Je třeba brát na zřetel, že struct FILE obsahuje vlastní buffer a ukazatel v uživatelském prostoru, tudíž po forku dojde k jeho duplikaci a vzájemné nezávislosti.

    Naopak int fd v uživ. prostoru je jen číslo, které si jádro spolu s PID přemapuje na interní deskriptor. Buffer file/socket descriptoru je v prostoru jádra a je jenom jeden.

    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.