Apple představil iPhone Pocket pro stylové přenášení iPhonu. iPhone Pocket vzešel ze spolupráce značky ISSEY MIYAKE a Applu a jeho tělo tvoří jednolitý 3D úplet, který uschová všechny modely iPhonu. iPhone Pocket s krátkým popruhem se prodává za 149,95 dolarů (USA) a s dlouhým popruhem za 229,95 dolarů (USA).
Byla vydána nová stabilní verze 7.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 142. Přehled novinek i s náhledy v příspěvku na blogu.
Společnost Epic Games vydala verzi 5.7 svého proprietárního multiplatformního herního enginu Unreal Engine (Wikipedie). Podrobný přehled novinek v poznámkách k vydání.
Intel vydal 30 upozornění na bezpečnostní chyby ve svých produktech. Současně vydal verzi 20251111 mikrokódů pro své procesory.
Byla vydána říjnová aktualizace aneb nová verze 1.106 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.106 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Canonical pro své zákazníky, předplatitele Ubuntu Pro, prodloužil podporu Ubuntu LTS z 12 let na 15 let (Legacy add-on). Týká se verzí od 14.04 (Trusty Tahr).
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 5.0.0. Nově je oficiálně podporován Linux ARM64/AArch64. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byla vydána verze 10 dnes již multiplatformního open source frameworku .NET (Wikipedie). Přehled novinek v příspěvku na blogu Microsoftu. Další informace v poznámkách k vydání na GitHubu nebo v přednáškách na právě probíhající konferenci .NET Conf 2025.
Rodina hardwaru služby Steam se začátkem roku 2026 rozroste. Steam Deck doplní nový Steam Controller, herní PC Steam Machine se SteamOS s KDE Plasmou a bezdrátový VR headset s vlastními ovladači Steam Frame.
Amazon Web Services (AWS) oznámil (en) výstavbu Fastnetu – strategického transatlantického optického kabelu, který propojí americký stát Maryland s irským hrabstvím Cork a zajistí rychlý a spolehlivý přenos cloudových služeb a AI přes Atlantik. Fastnet je odpovědí na rostoucí poptávku po rychlém a spolehlivém přenosu dat mezi kontinenty. Systém byl navržen s ohledem na rostoucí provoz související s rozvojem umělé inteligence a
… 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: