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 15:22 | IT novinky

    Eric Lengyel dobrovolně uvolnil jako volné dílo svůj patentovaný algoritmus Slug. Algoritmus vykresluje text a vektorovou grafiku na GPU přímo z dat Bézierových křivek, aniž by využíval texturové mapy obsahující jakékoli předem vypočítané nebo uložené obrázky a počítá přesné pokrytí pro ostré a škálovatelné zobrazení písma, referenční ukázka implementace v HLSL shaderech je na GitHubu. Slug je volným dílem od 17. března letošního

    … více »
    NUKE GAZA! 🎆 | Komentářů: 0
    dnes 15:11 | Zajímavý projekt

    Sashiko (GitHub) je open source automatizovaný systém pro revizi kódu linuxového jádra. Monitoruje veřejné mailing listy a hodnotí navrhované změny pomocí umělé inteligence. Výpočetní zdroje a LLM tokeny poskytuje Google.

    Ladislav Hagara | Komentářů: 3
    dnes 04:44 | Zajímavý software

    Cambalache, tj. RAD (rapid application development) nástroj pro GTK 4 a GTK 3, dospěl po pěti letech vývoje do verze 1.0. Instalovat jej lze i z Flathubu.

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

    KiCad (Wikipedie), sada svobodných softwarových nástrojů pro počítačový návrh elektronických zařízení (EDA), byl vydán v nové major verzi 10.0.0 (𝕏). Přehled novinek v příspěvku na blogu.

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

    Letošní Turingovou cenu (2025 ACM A.M. Turing Award, Nobelova cena informatiky) získali Charles H. Bennett a Gilles Brassard za základní přínosy do oboru kvantové informatiky, které převrátily pojetí bezpečné neprolomitelné komunikace a výpočetní techniky. Jejich protokol BB84 z roku 1984 umožnil fyzikálně zaručený bezpečný přenos šifrovacích klíčů, zatímco jejich práce o kvantové teleportaci položila teoretické základy pro budoucí kvantový internet. Jejich práce spojila fyziku s informatikou a ovlivnila celou generaci vědců.

    Ladislav Hagara | Komentářů: 6
    včera 04:44 | Zajímavý článek

    Firefox 149 dostupný od 24. března přinese bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně (s CZ a SK se zatím nepočítá) a zobrazení dvou webových stránek vedle sebe v jednom panelu (split view). Firefox Labs 149 umožní přidat poznámky k panelům (tab notes, videoukázka).

    Ladislav Hagara | Komentářů: 2
    včera 00:33 | Nová verze

    Byla vydána nová stabilní verze 7.9 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 146. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 00:11 | Zajímavý software

    Dle plánu byla vydána Opera GX pro Linux. Ke stažení je .deb i .rpm. V plánu je flatpak. Opera GX je webový prohlížeč zaměřený na hráče počítačových her.

    Ladislav Hagara | Komentářů: 7
    19.3. 19:22 | Nová verze

    GNUnet (Wikipedie) byl vydán v nové major verzi 0.27.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.

    Ladislav Hagara | Komentářů: 0
    19.3. 04:00 | Bezpečnostní upozornění

    Byly publikovány informace (technické detaily) o bezpečnostním problému Snapu. Jedná se o CVE-2026-3888. Neprivilegovaný lokální uživatel může s využitím snap-confine a systemd-tmpfiles získat práva roota.

    Ladislav Hagara | Komentářů: 4
    Které desktopové prostředí na Linuxu používáte?
     (15%)
     (7%)
     (1%)
     (12%)
     (29%)
     (2%)
     (5%)
     (1%)
     (13%)
     (24%)
    Celkem 1123 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.