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 13:33 | Zajímavý software

    Cheat Engine (Wikipedie) je s verzí 7.7 k dispozici už také pro Linux. Jedná se o proprietární skener/debugger paměti používaný především k cheatování v počítačových hrách.

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

    Vláda USA nařídila společnosti Anthropic pozastavit přístup k modelům Fable 5 a Mythos 5 pro všechny cizince, včetně zaměstnanců Anthropicu.

    Ladislav Hagara | Komentářů: 6
    včera 02:22 | Nová verze

    Společnost Murena představila (YouTube) novou verzi 4.0 mobilního operačního systému /e/OS (Wikipedie) založeného na Androidu a LineageOS bez aplikací a služeb od Googlu.

    Ladislav Hagara | Komentářů: 0
    12.6. 16:33 | Bezpečnostní upozornění

    V Arch User Repository (AUR) bylo kompromitováno přes 400 opomíjených balíčků (jejich seznam). Útočník do nich začlenil škodlivý npm balíček atomic-lockfile, který krade citlivá data uživatelů. Publikována byla předběžná analýza spouštěného malwaru deps.

    Ladislav Hagara | Komentářů: 11
    12.6. 11:33 | Nová verze

    Homebrew, správce balíčků nejen pro macOS, byl vydán ve verzi 6.0.0 (seznam změn). Hlavními novinkami jsou bezpečnostní mechanismus tap trust kvůli důvěryhodnosti závislostí, vylepšení sandboxingu na Linuxu, interní JSON API nebo zlepšení výkonu.

    |🇵🇸 | Komentářů: 0
    12.6. 03:33 | Bezpečnostní upozornění

    Byla nalezena a 9. června opravena kritická zranitelnost ve FreeBSD v Kernel TLS (KTLS). Pojmenována byla Bumsrakete (FreeBSD-SA-26:26.ktls, CVE-2026-45257). Lokální neprivilegovaný uživatel může přepisovat soubory, ke kterým má právo pouze pro čtení. Přepsáním setuid binárky a jejím spuštěním může získat roota. Na všech verzích od verze 13.0 vydané v dubnu 2021.

    Ladislav Hagara | Komentářů: 2
    11.6. 14:11 | Komunita

    Vývojáři open source operačního systému ReactOS (Wikipedie), jehož cílem je kompletní binární kompatibilita s aplikacemi a ovladači pro Windows, se na síti 𝕏 pochlubili, že ReactOS zvládne počítačovou hru Half-Life.

    Ladislav Hagara | Komentářů: 5
    11.6. 10:44 | Nová verze

    Byla vydána nová verze 4.8 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Využíván je Free Pascal Compiler (FPC) 3.2.2.

    Ladislav Hagara | Komentářů: 0
    11.6. 04:44 | Nová verze

    Apple container dospěl do verze 1.0.0. Jedná se o open source nástroj pro spouštění linuxových kontejnerů na macOS postavený nad containerization. Napsaný je v programovacím jazyce Swift a optimalizovaný pro Apple silicon.

    Ladislav Hagara | Komentářů: 5
    11.6. 03:33 | Nová verze

    Bylo vydáno Eclipse IDE 2026-06 aneb Eclipse 4.40. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (8%)
     (2%)
     (16%)
     (31%)
     (3%)
     (6%)
     (3%)
     (15%)
     (26%)
    Celkem 1905 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: komunikace s FIFO a poll()

    21.2.2010 13:46 ext3fs
    komunikace s FIFO a poll()
    Přečteno: 291×
    Dobry den, hraji si ted s komunikaci pres FIFO v C a stale mi program stoji u read() a bere veskere CPU. Zde je maly priklad:

    master proces:
    int main(void)
    {             
    int pipe_fd;  
    int ret;      
    int n;        
    struct pollfd ufds[1];
    char buff[32];        
    
            pipe_fd = mkfifo("./pipe",660);
    
            pipe_fd = open("./pipe", O_RDONLY | O_NONBLOCK, 660);
    
            ufds[0].fd = pipe_fd;
            ufds[0].events = POLLIN;
            ufds[0].revents = 0;    
    
            while(1)
            {
                    ret = poll(ufds, 1, 1000);
    
                    if (ret == -1)
                    {
                            printf("poll error\n");
                            close (pipe_fd);
                            exit (1);
                    }
                    else if (ret == 0)
                            printf("no data...\n");
                    else
                    {
                            if (ufds[0].revents == POLLIN)
                            {
                                    do
                                    {
                                        n = read(pipe_fd, buff, 32);
                                        if (n == -1)
                                        {
                                            printf("read error\n");
                                            break;
                                        }
                                        else
                                            printf("recv (%d)\n",n);
                                    } while (n != 0);
                            }
                    }
            }
    
            close(pipe_fd);
    
            return(0);
    }
    
    slave proces:
    int main(void)
    {
    int pipe_fd;
    char buff[32];
    
            pipe_fd = open("./pipe",O_WRONLY | O_NONBLOCK ,660);
    
            strcpy(buff, "ahoj");
    
            write(pipe_fd, buff, 5);
    
            close(pipe_fd);
    
            return(0);
    
    }
    
    Nevite kde je problem? Dekuji.

    Odpovědi

    21.2.2010 14:09 Jirka P
    Rozbalit Rozbalit vše Re: komunikace s FIFO a poll()
    Dost ti tam chybí ošetření chyb, takže:

    - proč otvíráš rouru pro zapisování s O_NONBLOCK, ale neošetřuješ situaci, kdy druhý konec roury není otevřený (vrátí to chybu)

    - když otevřeš rouru pro čtení s O_NONBLOCK bez otevřeného protějšku, roura se sice otevře, ale čtení bude pořád vracet 0 (a tedy bude roura pořád připravena pro čtení z hlediska select() nebo poll()

    Doporučil bych vykašlat se na O_NONBLOCK a důsledně ošetřit všechny chyby, včetně konce čtení. Pak by to mělo fungovat.
    21.2.2010 14:23 ext3fs
    Rozbalit Rozbalit vše Re: komunikace s FIFO a poll()
    Priklad je jen ilustrativni a opravdu jsem tam osetreni neresil.

    V podstate jde o to, ze master proces (daemon) bezi stale a mimo ostatni funkce se obcas zepta roury zda tam nema data od slave procesu, ktery se spousti jen pro zadavani prikazu daemonu (tedy velmi malo casto). Takze nejprve se stejne roura otevira pro cteni.
    21.2.2010 15:35 ext3fs
    Rozbalit Rozbalit vše Re: komunikace s FIFO a poll()
    Problem je take v tom, ze pokud oteviram rouru bez priznaku O_NDELAY nebo O_NONBLOCK, tak se proces zastavi (dle strace) na open() a ceka na otevreni druheho konece coz je v mem pripade nezadouci. Jak tohle osetrit bez pouziti O_NDELAY nebo O_NONBLOCK?
    21.2.2010 16:41 Jirka P
    Rozbalit Rozbalit vše Re: komunikace s FIFO a poll()
    Pokud vím, tak něco jako select() na podmínku "někdo jiný otevřel rouru a já z ní tedy můžu číst" neexistuje. Popsané chování open() je normální, bez O_NONBLOCK se oba procesy rozběhnou až potom, co jsou oba konce otevřeny.

    Sice to považuji za prasárnu, ale doporučil bych v tom master (čtecím) procesu otevřít tu rouru O_RDWR, bez O_NONBLOCK. To se povede vždycky, na nic to nečeká a můžete pak čekat select()em na data, která do ní někdo zapíše (samozřejmě do ní v master procesu zapisovat nebudete).
    21.2.2010 17:12 ext3fs
    Rozbalit Rozbalit vše Re: komunikace s FIFO a poll()
    Funguje to, ale pouze s otevrenim pro cteni a s priznakem O_NONBLOCK, jinak to stale stalo na read() i po prijeti dat a ukonceni slave procesu.
    Fuky avatar 21.2.2010 20:12 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: komunikace s FIFO a poll()
    do
    {
    
    // Tady Ti chybí poll() nebo select(), který musíš použít vždy, 
    // když máš file descriptor otevřený v neblokujícím režimu,
    // jelikož ho tam nemáš fce read() je okamžitě opuštěna a proto
    // Ti to "žere" procesor
    
        n = read(pipe_fd, buff, 32);
        if (n == -1)
        {
            printf("read error\n");
            break;
        }
        else
            printf("recv (%d)\n",n);
    } while (n != 0);
    

    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.