GNU Project Debugger aneb GDB byl vydán ve verzi 17.1. Podrobný přehled novinek v souboru NEWS.
Josef Průša oznámil zveřejnění kompletních CAD souborů rámů tiskáren Prusa CORE One a CORE One L. Nejsou vydány pod obecnou veřejnou licenci GNU ani Creative Commons ale pod novou licencí OCL neboli Open Community License. Ta nepovoluje prodávat kompletní tiskárny či remixy založené na těchto zdrojích.
Nový CEO Mozilla Corporation Anthony Enzor-DeMeo tento týden prohlásil, že by se Firefox měl vyvinout v moderní AI prohlížeč. Po bouřlivých diskusích na redditu ujistil, že v nastavení Firefoxu bude existovat volba pro zakázání všech AI funkcí.
V pořadí šestou knihou autora Martina Malého, která vychází v Edici CZ.NIC, správce české národní domény, je titul Kity, bity, neurony. Kniha s podtitulem Moderní technologie pro hobby elektroniku přináší ucelený pohled na svět současných technologií a jejich praktické využití v domácích elektronických projektech. Tento knižní průvodce je ideální pro každého, kdo se chce podívat na současné trendy v oblasti hobby elektroniky, od
… více »Linux Foundation zveřejnila Výroční zprávu za rok 2025 (pdf). Příjmy Linux Foundation byly 311 miliónů dolarů. Výdaje 285 miliónů dolarů. Na podporu linuxového jádra (Linux Kernel Project) šlo 8,4 miliónu dolarů. Linux Foundation podporuje téměř 1 500 open source projektů.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.12.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
OpenZFS (Wikipedie), tj. implementace souborového systému ZFS pro Linux a FreeBSD, byl vydán ve verzi 2.4.0.
Kriminalisté z NCTEKK společně s českými i zahraničními kolegy objasnili mimořádně rozsáhlou trestnou činnost z oblasti kybernetické kriminality. V rámci operací OCTOPUS a CONNECT ukončili činnost čtyř call center na Ukrajině. V prvním případě se jednalo o podvodné investice, v případě druhém o podvodné telefonáty, při kterých se zločinci vydávali za policisty a pod legendou napadeného bankovního účtu okrádali své oběti o vysoké finanční částky.
Na lepší pokrytí mobilním signálem a dostupnější mobilní internet se mohou těšit cestující v Pendolinech, railjetech a InterPanterech Českých drah. Konsorcium firem ČD - Telematika a.s. a Kontron Transportation s.r.o. dokončilo instalaci 5G opakovačů mobilního signálu do jednotek Pendolino a InterPanter. Tento krok navazuje na zavedení této technologie v jednotkách Railjet z letošního jara.
Rozšíření webového prohlížeče Urban VPN Proxy a další rozšíření od stejného vydavatele (např. 1ClickVPN Proxy, Urban Browser Guard či Urban Ad Blocker) od července 2025 skrytě zachytávají a odesílají celé konverzace uživatelů s AI nástroji (včetně ChatGPT, Claude, Gemini, Copilot aj.), a to nezávisle na tom, zda je VPN aktivní. Sběr probíhá bez možnosti jej uživatelsky vypnout a zahrnuje plný obsah dotazů a odpovědí, metadata relací i
… více »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:
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.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) ...
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
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).
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
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.
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
(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...
), tedy:
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.outdate > /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.
, 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).
Tiskni
Sdílej: