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í
×
    včera 18:33 | Nová verze

    Byla vydána (𝕏) nová verze 24.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na FreeBSD. Kódový název OPNsense 24.7 je Thriving Tiger. Přehled novinek v příspěvku na fóru.

    Ladislav Hagara | Komentářů: 0
    včera 05:11 | Bezpečnostní upozornění

    Binarly REsearch upozorňuje na bezpečnostní problém PKFail (YouTube) v ekosystému UEFI. Stovky modelů zařízení používají pro Secure Boot testovací Platform Key vygenerovaný American Megatrends International (AMI) a jeho privátní část byla při úniku dat prozrazena. Do milionů zařízení (seznam v pdf) po celém světě tak útočníci mohou do Secure Bootu vložit podepsaný malware. Otestovat firmware si lze na stránce pk.fail. Ukázka PoC na Linuxu na Windows na YouTube.

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

    Mobilní operační systém /e/OS (Wikipedie) založený na Androidu / LineageOS, ale bez aplikací a služeb od Googlu, byl vydán ve verzi 2.2 (Mastodon, 𝕏). Přehled novinek na GitLabu. Vypíchnuta je rodičovská kontrola.

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

    Společnost OpenAI představila vyhledávač SearchGPT propojující OpenAI modely umělé inteligence a informace z webů v reálném čase. Zatím jako prototyp pro vybrané uživatele. Zapsat se lze do pořadníku čekatelů.

    Ladislav Hagara | Komentářů: 0
    včera 00:11 | Nová verze

    Distribuce Linux Mint 22 „Wilma“ byla vydána. Je založená na Ubuntu 24.04 LTS, ale s desktopovým prostředím Cinnamon (aktuálně verze 6.2), příp. MATE nebo Xfce, balíkem aplikací XApp, integrací balíčků Flatpak a dalšími změnami. Více v přehledu novinekpoznámkách k vydání.

    Fluttershy, yay! | Komentářů: 2
    25.7. 17:44 | Zajímavý článek Ladislav Hagara | Komentářů: 2
    25.7. 17:22 | Nová verze

    Byla vydána nová verze 14 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v cgitu. Vypíchnout lze podporu rozšíření v Lua.

    Ladislav Hagara | Komentářů: 0
    25.7. 17:11 | Nová verze

    Byla vydána verze 1.80.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    25.7. 14:11 | IT novinky

    Apple oznámil, že v beta verzi spustil své Apple Maps na webu. Podporován je také webový prohlížeč Chrome. Ne však na Linuxu.

    Ladislav Hagara | Komentářů: 23
    25.7. 13:11 | IT novinky

    Portál Stack Overflow po roce opět vyzpovídal své uživatele, jedná se především o vývojáře softwaru, a zveřejnil detailní výsledky průzkumu. Průzkumu se letos zúčastnilo více než 65 tisíc vývojářů. Z Česka jich bylo 710. Ze Slovenska 246.

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Dotaz: Problem s mkfifo v C

    tomes.io avatar 18.11.2012 23:45 tomes.io | skóre: 12 | blog: tomesh
    Problem s mkfifo v C
    Přečteno: 645×
    Ahoj,

    mam za ukol naprogramovat systemoveho daemona, ktery bude cist data z pojmenovane roury a ty zapisovat do nejakeho souboru.Jenze mi nejde zapisovat.
    int main(int argc, char **argv) {
    
            int status;
            FILE *fw;
            int fp;
            char buf[255];
            int l; // read length
            int i;
            buf[0] = '\0'; // in case there is nothing to read
            buf[255] = '\0'; // garentee a end-of-line
    
            status = mkfifo("/tmp/pb173_syslog", S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
    
            if(status == -1) {
    
            		perror( "Mkfifo failed" );
            	    //exit(1); ;
            }
    
            /*Daemon reads the FIFO and writes into a text file*/
    
            fp = open("/tmp/pb173_syslog", "r");
    
            if(fp == -1) {
    
                    printf("Could not open the pipe\n");
            }
    
            fw = fopen("home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt", "a+");
    
            if(fw == -0) {
    
            	perror( "Opening logfile" );
                    exit(1); ;
            }
    
            while(1) {
            		l = read(fp, buf, 254);
                    if(l) // print only if the read length is greater than 0
                        printf("%s", buf);
                    	fprintf(fw, "%s", buf);
    
                    for(i=0; i<255; i++) // initialize the whole buffer again
                        buf[i] = '\0';
            }
    
            close(fp);
            close(fw);
    
    
    
            exit(EXIT_SUCCESS);
    }
    Selhava mi to tady a ja netusim vubec proc. V manualu je psane, ze pri neuspechu se vraci nula. Proc se ale vraci? Nevidim zadny duvod, proc by to melo selhavat...
    fw = fopen("home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt", "a+");
    
            if(fw == -0) {
    
            	perror( "Opening logfile" );
                    exit(1); ;
            }
    Vyhodi chybu:
    Opening logfile: No such file or directory
    Zajimalo by me co prehlizim.


    Řešení dotazu:


    Odpovědi

    18.11.2012 23:52 chrono
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ten adresár home/~/ naozaj existuje?
    pavlix avatar 19.11.2012 00:05 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    fw = fopen("home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt", "a+");
    Zkus do konzole zadat:
    ls home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt
    
    Já třeba žádnou takovouhle cestu v systému nemám.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    19.11.2012 07:46 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    "If the file is successfully opened, the function returns a pointer to a FILE object that can be used to identify the stream on future operations. Otherwise, a null pointer is returned.On most library implementations, the errno variable is also set to a system-specific error code on failure."

    Ty tam vidis neco o nule? :-)
    tomes.io avatar 19.11.2012 15:01 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    "If the file is successfully opened....Otherwise, a null pointer is returned.
    Cili pokud je otevreni uspesne, do promenne se priradi ukazatel. Pokud je neuspesne, priradi se nulovy ukazatel. Otevirani souboru se odjakteziva testuje na nulu a nevim, proc by tomu melo byt jinak. Schvalne si vygoogli "fopen test if file exists" ;)
    19.11.2012 15:04 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Otevirani souboru se odjakteziva testuje na nulu a nevim, proc by tomu melo byt jinak.

    Třeba proto, že když je to pointer, měl byste ho testovat na NULL (pointer), ne na nulu (číslo). Nebo rovnou psát if (fp) ...

    tomes.io avatar 19.11.2012 15:22 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ano, dejuji za upozorneni na NULL. No i po oprave to hazi stejnou chybu.
    19.11.2012 16:37 Zadejte vaše jméno
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ve skutecnosti je v C uplne jedno jestli porovnavas neco na NULL, nebo 0. :)
    19.11.2012 18:05 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ve skutecnosti ne, jen u vetsiny compilatoru, ale NE VE VSECH, takze nepodporuj nikoho v prasarnach a dodrzuj strict standarts :-)
    pavlix avatar 19.11.2012 18:13 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Zrovna toto je pokud vím dáno standardem.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    19.11.2012 19:00 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Standartem? :-) NULL ani 0 v tomto kontextu neni ve skutecnosti nula, ale compiler to interne reprezentuje nejakou jinou binarni hodnotou. Nikde ve standartech neni psano, ze musi preprezentovat NULL a 0 stejnou hodnotou, proto neni zaruceno, ze VZDY NULL === 0. To, ze to vetsina soucasnych nejpouzivanejsich compileru interpetuje shodne neznamena, ze je to spravne reseni. Compilatory se vyviji, meni, proto je vzdy dobre se drzet dokumentace, minimalne tim clovek ziska spravne navyky :-)
    pavlix avatar 19.11.2012 19:15 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Standartem?
    Ne. Standardem. Ale mám to z druhé ruky, nedíval jsem se přímo do standardu.
    NULL ani 0 v tomto kontextu neni ve skutecnosti nula, ale compiler to interne reprezentuje nejakou jinou binarni hodnotou.
    Citation needed.
    Nikde ve standartech neni psano, ze musi preprezentovat NULL a 0 stejnou hodnotou, proto neni zaruceno, ze VZDY NULL === 0.
    Standardech. Dobře, tak se do nějakého toho draftu, co se dá vygooglit:
    An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
    Zdroj (pdf).
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    19.11.2012 22:20 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    No v C bych předpokládal že NULL je ((void *) 0) a v C++ je to 0, což přináší určitá úskalí.
    Ale v C není ((void *) 0) garantováno, mohlo by to být i třeba ((void *) 42), pokud by to byl nulový pointer a byly splněny ostatní podmínky.
    V témže dokumentu je napsáno: The macros are NULL which expands to an implementation-defined null pointer constant; and…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    20.11.2012 06:22 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Presne tak, trosku jsem cekal, ze na to dotycny prijde sam :-) V C++ je ta 0 jasna, i tak se radsi drzim striktne dokumentace, ackoliv v tomto prijde me to bude stat o 3 znaky na radku vic :-)
    20.11.2012 09:54 jekub
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    jeden pán má na to trošku jiný názor
    20.11.2012 10:20 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Myslím, že spíše se soustředil na konstrukce typu:
    MyType *var = 0; místo MyType *var = NULL;
    , ale pokud něco piše, že NULL, tak, si myslím, je lepší to testovat na NULL a když to píše 0, tak na 0.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    20.11.2012 10:22 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Jiny nazor? V cem? Jasne tam rika, ze v C++ je NULL roven 0, coz jsem napsal. V C je to pochopitelne jinak, ale to vse uz zde bylo napsane, staci umet cist a nepastovat sem veci k jinemu programovacimu jazyku, nez ktery se tu resi ;-)
    pavlix avatar 20.11.2012 12:30 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ale v C není ((void *) 0) garantováno, mohlo by to být i třeba ((void *) 42)
    Tak ještě jednou cituji:

    An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.

    Tedy, česky, výraz vyhodnocující na nulu (například konstanta 0), či stejný výraz přetypovaný na typ void * (tedy například (void *) 0) se nazývá nulovou pointerovou kontantou.

    Pokud by ti to nestačilo, tak o kousek níže nadeš:

    Any two null pointers shall compare equal.

    Čímž by mělo být prokázáno i tvrzení, johož zpochybněním George O. toto vlákno začal:
    Ve skutecnosti je v C uplne jedno jestli porovnavas neco na NULL, nebo 0. :)
    Lepší „garanci“ než citaci z draftu bohužel momentálně nabídnout nemůžu.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    20.11.2012 12:47 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    "The macros are NULL which expands to an implementation-defined null pointer constant" -- so it can expand to "0", or "((void *)0)".

    Vyplyva z toho, ze NULL je VZDY 0? :-)
    20.11.2012 12:55 George O.
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Tady mas par reakci z #C channelu na IRC :-)

    Grievre: what you are thinking about is that when you assign NULL or 0 to a pointer, and then examine that pointer's bit pattern somehow (by putting it in union with a char array for example), it is not necessarily all-bits-zero

    Grievre: that is, if you memset a struct to 0, and the struct contains a pointer, the pointer is not necessarily set to be a null pointer

    Grievre:same with floats and doubles, float/double "zero" is not necessarily all-zeroes

    fizzie: As for differences between NULL and plain 0, here's one: given void f(x) void *x; { ... } then f(0); is always undefined behaviour, while f(NULL); implementation-definedly either is or isn't.

    skyel: yes but on all sane architectures NULL is a typedef for (void*) 0 Grievre: fizzie: also printf("%p", NULL) versus printf("%p", 0) Grievre: er, assuming %p is standard which it might not be
    20.11.2012 15:42 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Asi se chceme dostat každý do jiné uličky, hodím jen odkaz na souhrn zajímavostí k danému tématu a dále budu jen předpokládat bez záruky, že NULL je v C (void *)0.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    pavlix avatar 20.11.2012 22:06 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    To je známá věc. Přesně z toho důvodu je to podle mě ve standardu napsáno tak, jak je to napsáno,
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    19.11.2012 15:05 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Mimochodem, jaký smysl tam vlastně má to "-0"?
    tomes.io avatar 19.11.2012 15:20 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Zadny, to je trapny preklep, ktery v kodu neni. Tedy to minusko pred nulou.
    19.11.2012 08:10 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C

    1. V dotazu chybí podstatná informace: jestli ten soubor opravdu existuje - jako nejpravděpodobnější se mi jeví vysvětlení, že skutečně neexistuje.

    2. Proč jste použil subject "Problem s mkfifo v C"? Ať se na to dívám, jak chci, pořád tam žádný problém s mkfifo() nevidím, chybu dostáváte při otevření úplně jiného souboru a to, že jste předtím použil mkfifo() s nějakou jinou cestou, na to nemá žádný vliv.

    tomes.io avatar 19.11.2012 14:54 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    No jako podstatnou informaci jsem spise zapomnel uvest, ze ta vlnovka v kodu neni, ale je tam jmeno domovskeho adresare, ktere jsem nechtel prozrazovat. Cili esta je korektni.

    ad 1. ano, soubor existuje, a pokud je mi znamo, i kdyby neexistoval, tak se vytvori. Aspon co si pamatuju z mych starych kodu, vzdy to tak bylo.

    ad 2. Mea culpa, puvodne to byl opravdu problem s mkfifo, ten mi taky hazel chubu, ale nez jsem stacil dotaz dopsat, tak jsem to opravil :)
    19.11.2012 15:01 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    No jako podstatnou informaci jsem spise zapomnel uvest, ze ta vlnovka v kodu neni, ale je tam jmeno domovskeho adresare, ktere jsem nechtel prozrazovat.

    Úžasné… ale zkuste se možná spíš vážně zamyslet nad tím, kdy je informace opravdu potřeba schovávat a kdy tím jen komplikujete práci tomu, kdo by mohl chtít odpovídat. U mne třeba obfuskování dotazu automaticky zvyšuje pravděpodobnost, že ho budu ignorovat.

    pokud je mi znamo, i kdyby neexistoval, tak se vytvori

    Jen pokud existuje adresář, ve kterém by se měl vytvořit. Navíc ta cesta, kterou tam máte, je relativní. Jste si jistý, že pracovní adresář je ten, který si myslíte? (je-li vlnka místo uživatelkého jména, tak nejspíš kořenový)

    tomes.io avatar 19.11.2012 15:16 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ano, nekdy bych mel vic myslet. Nejsem holt dokonaly.

    S pracovnim adresarem si jsem jisty, jen si nejsem jisty, kdo si tu plete absolutni cestu s relativni. Pokud vim tak absolutni je uplna cesta k souboru. Coz mam i v kodu.
    19.11.2012 15:59 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Když cesta nezačíná lomítkem, vyhodnocuje se jako relativní, tj. relativně vůči aktuálnímu pracovnímu adresáři. Jak by podle vás měla ta funkce poznat, že je cesta absolutní?
    19.11.2012 10:51 sss
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    V programech nefunguje expanze znaku typu ~, $HOME a pod (to jsou funkce shellu).
    19.11.2012 10:54 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    V řetězci "home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt" by nefungovala expanze vlnky ani v shellu, takže celá ta cesta je krajně podezřelá.
    tomes.io avatar 19.11.2012 15:12 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Mno, tak aby toho nebylo malo.. pokud ve fopen zamenim cestu absolutni za relativni:
    fw = fopen("fifo_log.txt", "a+");
    Tak se vytvori soubor fifo_log.txt v aktualnim adresari (resp. u me v adresari s Eclipse projektem), ale nic se do nej nezapise.

    Cili jsou tu dve zahady:

    a) proc absolutni cesta nefunguje a relativni ano?

    b) proc se do osuboru nic nezapisuje,i kdyz by melo?
    19.11.2012 15:25 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    a) "home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt"" je relativní nesmysl
    b) asi nic nepřišlo, tedy, „přečte to něco?“
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    tomes.io avatar 19.11.2012 15:30 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ano, pochopil jsem. Spravne, absolutne, to ma byt:
    fw = fopen("/home/mujdomaciadresar/Documents/Vyvoj_C/ukol_4/fifo_log.txt", "a+");
    ad b) ano precte, do konzole (printf) to vypise. Nezapise se to ale do souboru (fprintf).
    19.11.2012 16:03 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ale vypíše, ale až přijde čas, popožeň to pomocí fflush(fw); :)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    19.11.2012 16:40 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    A nemixoval bych fce, k open() patří close(), k fopen() patří fclose(), '-0' je zajímavá, ale testoval bych na (NOT) NULL (vždy na to co se píše v dokumentaci).
    Jinak flush bufferů se obvykle neprovede při násilné přerušení, ale jen při normálním ukončení programu tedy exit(x), ale už ne např. na na abort() nebo třeba Ctrl+C (není li odchyceno a ošetřeno). Nevím jestli je toto chování stejné napříč systémy, raději se o to starej sám.
    Pokud uslyšíš fámu, že návratový kód fclose() se neošetřuje (někdy je to opravdu zbytečné), tak ji neposlouchej, protože až fclose() říká, že systém zapsal data na disk (tedy z pohledu aplikace - může to být ještě v diskové cache systému). A když se to neošetřuje, tak sem tam nám někde vznikají ty neukončené soubory, byť nikdo se o chybě nedozvěděl (fclose() data flush-ne, ale když to zklame, data na disku nejsou a aplikačka nic nehlásí - prostě ideální stav :-)).
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    tomes.io avatar 19.11.2012 21:57 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Tak to me dostalo. fp jsem uzavrel:
    close(fp)
    fw potom:
    fclose(fw)
    coz situaci nevyresilo. fflush, dobry, ale kam s nim? Nejlogictejsi, co me napadlo, je pred fprintf:
    while(1) {
                   	l = read(fp, buf, 254);
                    if(l) // print only if the read length is greater than 0
                            printf("%s", buf);
                            fflush(fw);
                    	fprintf(fw, "%s", buf);
    
                    for(i=0; i<255; i++) // initialize the whole buffer again
                        buf[i] = '\0';
            }
    
            close(fp);
            fclose(fw);
    jenze, zcela nelogicky a nemozne v okamziku pridani fflush zacal kod selhavat na fci open 20 radku pred fflush!
    fp = open("/tmp/pb173_syslog", "r");
    
            if(fp == -1) {
    
                    printf("Could not open the pipe\n");
            }
    vypisuje to:
    "Could not open the pipe\n
    co se to jako deje? takhle se to vubec, ale vubec chovat nema, vzdyt je to imperativni program a fp neni s fflush(fw) preci nijak spojena. Kdyz ten fflush vykomentuju, tak to chyby nehodi. zkousel jsem to cca 10x a proste to ovlivnuje, i kdyz proste nemuze...

    taky bych poprosil toho, kdo oznacil toto vlakno jako vyresene, aby to zase odznavil, pac evidentne vyresene neni.

    Navic nevim, jak by fflush vyresil problem. Funkce fprintf proste musi zapsat do souboru to, co ma v poli buf. buf je naplneny, nic se z toho neztratilo.. ja to vazne nechapu...
    19.11.2012 22:49 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    To o uzavírání bylo jen tak na okraj…

    Zapsat a vysypat (četl's hlp od fflush()? :-) ), tedy:
    fprintf(fw, "%s", buf); //write to file buffer
    fflush(fw); //flus the buffer to disk
    
    K tomu selhávaní, těžko říct, pokud si s tím hraješ a zestřeluješ to a pod. a v zásadě neuklízíš… Ale zkus (předem smaž, nebo použij jiné fifo):
    fp = open("/tmp/pb173_syslog", O_RDONLY | O_NONBLOCK);
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    tomes.io avatar 20.11.2012 00:28 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ten NOBLOCK zda se, pomohl. Nyni to uz funguje a do zouboru to zapisuje. Toto je vysledny kod (includy jdou zde na foru BEZ <>, system tohoto fora mi nedovoluje zobrazovat tagovaci znacky), mozna by chtel jeste trochu vychytat. Je prekladany GCC pod linuxem.
     
    
    #include getopt.h
    #include stdio.h
    #include stdlib.h
    #include unistd.h
    #include sys/types.h
    #include sys/stat.h
    #include fcntl.h
    
    #define DEFAULT_INTERVAL 2
    
    int main(int argc, char **argv) {
    
            int status;
            FILE *fw;
            int fp;
            char buf[255];
            int l; // read length
            int i;
            buf[0] = '\0'; // in case there is nothing to read
            buf[255] = '\0'; // garentee a end-of-line
    
            status = mkfifo("/tmp/pb173_syslog", S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
    
            if(status == -1) {
    
            		perror( "Mkfifo failed" );
            	    //exit(1); ;
            }
    
            /*Daemon reads the FIFO and writes into a text file*/
    
            fp = open("/tmp/pb173_syslog", O_RDONLY | O_NONBLOCK);
    
            if(fp == -1) {
    
                    printf("Could not open the pipe\n");
            }
    
            fw = fopen("/home/tomesh/Documents/Vyvoj_C/ukol_4/fifo_log.txt", "a+");
    
            if(fw == NULL) {
    
            		perror( "Opening logfile" );
                    exit(1); ;
            }
    
            while(1) {
                   	l = read(fp, buf, 254);
                    if(l) // print only if the read length is greater than 0
                            printf("%s", buf);                       
                    	fprintf(fw, "%s", buf);
                            fflush(fw);
    
                            
                    for(i=0; i<255; i++) // initialize the whole buffer again
                        buf[i] = '\0';
            }
    
            close(fp);
            fclose(fw);
    
            exit(EXIT_SUCCESS);
    }
    
    
    
    tomes.io avatar 22.11.2012 21:01 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Jeste by me zajimalo, jak osetrit soubeh vice procesu v roure. Tedy kdyby do ni zaroven chtely zapsat dva ruzne programy kuprikladu, v jeden cas. Proste soubeh vice procesu v jedne roure. Da se to nejak osetrit?
    Josef Kufner avatar 22.11.2012 21:25 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Roury na tohle nejsou. Jakmile potřebuješ cokoliv složitějšího než cat | dog, tak sáhni po socketech (ať už unixových nebo síťových). S těmi není problém jednoduše a spolehlivě implementovat souběžnou komunikaci mezi mnoha prgramy.
    Hello world ! Segmentation fault (core dumped)
    23.11.2012 11:04 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Všimni si že mně to systém fóra umožňuje.
    #include <fcntl.h>
    int main(int argc, char **argv) {
      const char* fifof = "/tmp/pb173_syslog";
    
    holt musíš zapsat jako:
    <pre class="brush: c">
    #include &lt;fcntl.h&gt;
    int main(int argc, char **argv) {
      const char* fifof = &quot;/tmp/pb173_syslog&quot;;
    </pre>
    
    A to zvládne jen záměna
    & –> &amp;  
    " –> &quot;
    < –> &lt;
    > –> &lg;
    
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    19.11.2012 22:57 Jose
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Můžeš ukázat kompletní kód včetně všech #include, jakej používáš překladač s jakejma volbama a pod jakým OS to potom spouštíš ?
    19.11.2012 23:14 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Trochu jsem to učísl (neznamená, že tén kód je čistý, ani zdaleka :-) )
    Soubor kuk.c:
    #include <stdio.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <fcntl.h>
    
    int main(int argc, char **argv) {
      const char* fifof = "/tmp/pb173_syslog";
      FILE *fw = NULL;
      int fp = 0;
      char buf[255];
      buf[0] = buf[254] = '\0'; // in case there is nothing to read
    
      if(mkfifo(fifof, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH) != 0){
        perror( "Mkfifo failed" );
        //exit(1); ;
      }
    
      /*Daemon reads the FIFO and writes into a text file*/
      if((fp = open(fifof, O_RDONLY | O_NONBLOCK)) == -1){
        perror("Could not open the pipe\n");
        exit(3);
      }
    
      if((fw = fopen("fifo_log.txt", "a+")) == NULL){
        perror( "Opening logfile" );
        close(fp);
        exit(1); ;
      }
    
      while(1) {
        if(read(fp, buf, 254) > 0)
          printf("%s", buf);
        fprintf(fw, "%s", buf);
        fflush(fw);
        int i;
        /* na začátku né a fčul jo? */
        for(i=0; i<255; i++) // initialize the whole buffer again
          buf[i] = '\0';
      }
    
      close(fp);
      fclose(fw);
      return 0;
    }
    
    Compile: gcc kuk.c

    Start: ./a.out

    Druhý terminál ve stejném aktuálním adresáři:
    date > /tmp/pb173_syslog && sleep 1 && cat fifo_log.txt

    PS: Pole x[255] má 255 prvků s indexy od 0 po 254 (původní kód inicializoval x[255]).
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    20.11.2012 00:08 Jose
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Jasně, některý věci už jsi vychytal. Je mi nejasný jak to ukončuješ když se to pořád točí v té smyčce za while(1). Další problém může být v tom, že open vrací chybu jako záporné číslo, ne jen -1. Jestli to máš napsaný opravdu tak jak jsi to poslal tak by to mělo vypisovat na konzolu obsah tý pipe ale do souboru to bude psát dokola samý řetězce nulový délky občas proložený obsahem pipe ( nevím teď zpaměti jak fprintf reaguje na prázdný řetězec ). Korektně by bylo otevřít soubor pro append v okamžiku kdy rourou něco přijde, zapsat to a zase ho uzavřít, to fflush je taky zbytečný. Ta inicializace kolem dokola je naprosto zbytečná, když už by jsi chtěl prázdný buffer tak stačí buf[0] = '\0'; ale není to potřeba.
    20.11.2012 08:32 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Viz níže.
    '-1' je nedostatečné, jsem si toho všiml a zapomněl (bo si pamatuji, že jsem si ověřoval co vrací fce open, kteroužto nepoužívám)…
    Debata o tom jestli ve smyčce fopen() ; fwrite() ; fclose() nebo fopen() a ve smyčce fwrite() ; fflush() (a pak fclose()) je jiné téma a obě řešení jsou „korektní“.
    Inicializace není zbytečná, naopak nedostatečná - poprvé tam není. Ano, lze to udělat jinak (třeba jen zapsat '\0' na pozici vrácenou fcí read()).
    buf[0] = '\0' je inicializace jen prvního znaku a ne prázdné pole a opět debata o tom, jestli inicializovat celé pole, první znak či první a poslední (jeden nebo dokonce více + znaky navíc) je zase o něčem jiném.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    20.11.2012 09:09 Jose
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Pravdu díš, open vrací jenom přišlé znaky, konec řetězce je potřeba připojit ručně.
    20.11.2012 09:16 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C

    Sice taky z pověrčivosti (a ze zvyku) testuji raději na "< 0", ale

    Další problém může být v tom, že open vrací chybu jako záporné číslo, ne jen -1.

    V tom případě si stěžujte autorovi, že nerespektuje standardy. Viz open(3p):

    RETURN VALUE

    Upon successful completion, the function shall open the file and return a non-negative integer representing the lowest numbered unused file descriptor. Otherwise, -1 shall be returned and errno set to indicate the error. No files shall be created or modified if the function returns -1.

    20.11.2012 10:10 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    No vida jak se v tom plácám, možná proto jsem tam nakonec nechal tu '-1'…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    Josef Kufner avatar 20.11.2012 01:00 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Kašli na open, read a další funkce ze skupiny bez f na začátku. Zatím nemáš na to, abys je použil správně a ještě tomu tak dlouho bude. Jsou to nízkoúrovňová volání, která se chovají místy docela hodně zákeřně. Ošetřit všechno, co se tam může podělat není jen tak.

    Pokud do roury zapíšeš nulový bajt, tak vše za ním se ti nevypíše, fprintf to zahodí. Totéž platí pro printf.

    Pokud "zoptimalizuješ" mazání jen na buf[0] = 0, tak fprintf bude číst zbytky předchozích zpráv.

    Použij fopen i na rouru, data čti pomocí fread, zapisuj pomocí fwrite, fflush tam máš správně. Inicializace bufferu není potřeba, fread ti řekne, kolik načetl a ty to pak předáš fwrite.

    Buffer udělej na 4KB, je to obvyklá velikost s jakou pracuje systém, takže to poběží rychleji.

    Nemáš tam ukončovací podmínku -- viz funkce feof.

    A malý tip na konec: sizeof(buf) ti řekne 255. Do not repeat yourself.
    Hello world ! Segmentation fault (core dumped)
    20.11.2012 08:09 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Pokud to patřilo mně, tak já jsem jen vzal kód a zprovoznil jej a právě kdybych to měl napsat, tak bych musel znát zadání abych se rozhodl jak to napíšu.
    Pro upřesnění fprintf() zapisuje :-), ale asi je to narážka na můj komentář, tak tím jsem chtěl naznačit, že v prvním průchodu není pole buf inicializované… (krom prvního a posledního znaku).
    Možná jsem to měl přepsat na fce fxxxx, ale nechal jsem to dle původního - opět, nevím co je v zadání úlohy.
    Ukončovací podmínka tam nebyla, proto jsem i vysvětloval (možná blbě) výše, kdy se flush-ne buffer, protože toto se ukončuje (asi) „Ctrl+C“.
    „Neopakovat se“ - mě jen dráždil ten řetězec, ten jsem vyhodil navrch, zbytek jsem nechal ležet.
    Obecně přepisování takového kódu bez zadání je naprd, takže jsem to „jen“ zprovoznil, prostě jsem šel jen od vrchu a formátoval kód, něco pozměnil a dole doplnil fflush()…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    Josef Kufner avatar 20.11.2012 10:17 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Ne, tu větu s fprintf mám správně ;-)
    Hello world ! Segmentation fault (core dumped)
    20.11.2012 10:23 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Problem s mkfifo v C
    Už to přišlo… :-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

    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.