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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 16:00 | Nová verze

Byla vydána verze 0.98 svobodného nelineárního video editoru Pitivi. Z novinek lze zmínit například přizpůsobitelné klávesové zkratky. Videoukázka práce s nejnovější verzí Pitivi na YouTube.

Ladislav Hagara | Komentářů: 0
dnes 15:00 | Zajímavý software

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

Ladislav Hagara | Komentářů: 1
včera 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
včera 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

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

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 4
6.12. 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 27
6.12. 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 795 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 616×
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 71 | 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: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: Problem s mkfifo v C
Zrovna toto je pokud vím dáno standardem.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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).
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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,
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
19.11.2012 15:05 Michal Kubeček | skóre: 71 | 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: 71 | 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: 71 | 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: 71 | 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: 71 | 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: 66
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: 71 | 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: 66
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: 66
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.