Spolek OpenAlt zve příznivce otevřených technologií a otevřeného přístupu na 151. brněnský sraz, který proběhne v pátek 20. 4. od 18:00 hodin v restauraci Benjamin na Drobného 46.
Byla vydána verze 18.04.0 KDE Aplikací (KDE Applications). Přehled novinek v kompletním seznamu změn a na stránce s dalšími informacemi.
Bylo oznámeno vydání nové stabilní verze 1.26 a beta verze 1.27 open source textového editoru Atom (Wikipedie). Přehled novinek i s náhledy v příspěvku na blogu. Podrobnosti v poznámkách k vydání.
Dle plánu byla dnes vydána hra Rise of the Tomb Raider (Wikipedie) pro Linux. Koupit ji lze za 49,99 €.
Společnost Oracle vydala čtvrtletní bezpečnostní aktualizaci svých softwarových produktů (CPU, Critical Patch Update). Opraveno bylo celkově 254 bezpečnostních chyb. V Oracle Java SE je například opraveno 14 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 12 z nich. V Oracle MySQL je opraveno 33 bezpečnostních chyb. Vzdáleně zneužitelné bez autentizace jsou 2 z nich.
Byla vydána verze 8.0 linuxové distribuce Trisquel GNU/Linux. Nejnovější verze Trisquel nese kódové jméno Flidas a bude podporována do roku 2021. Výchozím prostředím je nově MATE 1.12. Trisquel patří mezi svobodné distribuce doporučované Nadací pro svobodný software (FSF).
Byla vydána nová verze 27.9.0 webového prohlížeče Pale Moon (Wikipedie) vycházejícího z Firefoxu. Přehled novinek v poznámkách k vydání. Jedná se o poslední větší aktualizaci verze 27. Vývojáři se zaměří na novou verzi 28.
Google Chrome 66 byl prohlášen za stabilní (YouTube). Nejnovější stabilní verze 66.0.3359.117 tohoto webového prohlížeče přináší řadu oprav a vylepšení. Vylepšeny byly také nástroje pro vývojáře (YouTube). Opraveno bylo 62 bezpečnostních chyb.
Byla vydána druhá RC verze nové řady 2.10 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP. Přehled novinek i s náhledy v oznámení o vydání.
Již tento čtvrtek (19. 4.) se v posluchárně 107 na Fakultě informačních technologií ČVUT v Praze Dejvicích odehraje večer s Turrisem, tentokrát zaměřený na nový modulární router MOX. Mluvit o něm budou Patrick Zandl a Ondřej Filip, ale bude i prostor pro dotazy a diskuzi s vývojáři. Akce začíná v 18:00 a plánovaný konec je v 19:45. Mapka, kde se nachází daná posluchárna, a možnost registrace je k dispozici na webu CZ.NIC.
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 directoryZajimalo by me co prehlizim.
Řešení dotazu:
Zkus do konzole zadat:fw = fopen("home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txt", "a+");
ls home/~/Documents/Vyvoj_C/ukol_4/fifo_log.txtJá třeba žádnou takovouhle cestu v systému nemám.
"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" ;)
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) ...
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).
MyType *var = 0;
místo MyType *var = NULL;
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.
(void *)0
.
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.
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ý)
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á.
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?
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).
fflush(fw);
:)
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).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.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 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\nco 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...
fprintf(fw, "%s", buf); //write to file buffer fflush(fw); //flus the buffer to diskK 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);
#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); }
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.
#include <fcntl.h> int main(int argc, char **argv) { const char* fifof = "/tmp/pb173_syslog";holt musíš zapsat jako:
<pre class="brush: c"> #include <fcntl.h> int main(int argc, char **argv) { const char* fifof = "/tmp/pb173_syslog"; </pre>A to zvládne jen záměna
& –> & " –> " < –> < > –> ≶
#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
./a.out
date > /tmp/pb173_syslog && sleep 1 && cat fifo_log.txt
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.
Tiskni
Sdílej: