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 18:22 | Bezpečnostní upozornění

    Nejnovější X.Org X server 21.1.22 a Xwayland 24.1.10 řeší 5 bezpečnostních chyb: CVE-2026-33999, CVE-2026-34000, CVE-2026-34001, CVE-2026-34002 a CVE-2026-34003.

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

    Po roce vývoje od vydání verze 1.28.0 byla vydána nová stabilní verze 1.30.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.30.

    Ladislav Hagara | Komentářů: 0
    dnes 17:33 | Nová verze

    Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2026-04-13. Přehled novinek poznámkách k vydání. Nově ve výchozím nastavení příkaz sudo vyžaduje heslo.

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

    Společnost Blackmagic Design oznámila vydání verze 21 svého proprietárního softwaru pro editování videí a korekci barev DaVinci Resolve běžícího také na Linuxu. Z novinek je nutno vypíchnout možnost editování fotografií. Základní verze DaVinci Resolve je k dispozici zdarma. Plnou verzi DaVinci Resolve Studio lze koupit za 295 dolarů.

    Ladislav Hagara | Komentářů: 7
    dnes 05:00 | Nová verze

    Multipatformní renderovací jádro webového prohlížeče Servo je na crates.io. S vydáním verze 0.1.0 (LTS).

    Ladislav Hagara | Komentářů: 0
    včera 23:33 | Komunita

    Nadace FreeBSD Foundation před týdnem oznámila projekt Laptop Integration Testing. Vyzvala dobrovolníky, aby pomocí nástroje otestovali podporu FreeBSD na svých zařízeních a výsledky odeslali vývojářům. Vznikla stránka Nejlepší notebooky pro FreeBSD.

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

    Na začátku srpna vstoupí v účinnost nová evropská pravidla transparentnosti pro umělou inteligenci (AI). Zavádějí povinnost jakýkoli AI obsah označit, informovat o takzvaných deepfakes a upozornit uživatele, že komunikuje s umělou inteligencí. Cílem opatření je omezit šíření manipulativního či klamavého obsahu, zvýšit důvěru v digitální prostředí a chránit uživatele.

    Ladislav Hagara | Komentářů: 8
    včera 10:22 | Humor

    Connor Byrne z USA používal pro přihlašování na svůj iPhone 13 s iOS 18 heslo obsahující háček. Po aktualizaci na iOS 26.4 se už ale do telefonu nepřihlásí. Při přihlašování nelze tento háček zadat. Apple jej prostě odstranil [The Register].

    Ladislav Hagara | Komentářů: 36
    včera 03:11 | Nová verze

    Linus Torvalds vydal jádro Linux 7.0. Podrobný výčet změn je ke zhlédnutí na stránce Kernel Newbies, stručné výběry v LWN (část první, druhá).

    |🇵🇸 | Komentářů: 5
    včera 02:44 | Komunita

    Na čem aktuálně pracují vývojáři GNOME? Pravidelný přehled novinek v Týden v GNOME. Vypíchnout lze novou verzi 2026.1 přehrávače hudby Amberol (Flathub).

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 1323 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    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.