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 »QStudio, tj. nástroj pro práci s SQL podporující více než 30 databází (MySQL, PostgreSQL, DuckDB, QuestDB, kdb+, …), se stal s vydáním verze 5.0 open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí Apache 2.0.
Nezatracoval bych popen(), myslím, že to také není špatné řešení. Tak proč mu to rovnou nepředáš jako argument, když se jedná jen o pár dat. Kdyžtak víc rozepiš o co konkrétně jde, třeba nás toho pak napadne víc.
I při použití fork() a zabití rodiče dle mého názoru pokračuje potomek v pohodě, stačí postupovat dle Linux Daemon Writing HOWTO
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
int main(void) {
/* Our process ID and Session ID */
pid_t pid, sid;
/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}
/* Change the file mode mask */
umask(0);
/* Open any logs here */
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Change the current working directory */
if ((chdir("/")) < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
/* Daemon-specific initialization goes here */
/* The Big Loop */
while (1) {
/* Do some task here ... */
sleep(30); /* wait 30 seconds */
}
exit(EXIT_SUCCESS);
}
Jinak proč před fork() nepřipravíš data do paměti, jejich kopie bude dostupná i v potomku, včetně stejné adresy.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define STRING_MAX 512
int main(int argc, char *argv[])
{
char string[STRING_MAX+1];
pid_t pid;
strcpy(string, "Hello World");
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
else if (pid > 0) {
memset(string, 0, STRING_MAX+1);
printf("0x%x parent string = '%s'\n", string, string);
printf("Exit the parent process\n");
exit(EXIT_SUCCESS);
}
sleep(3);
printf("0x%x child string = '%s'\n", string, string);
return 0;
}
$ ./example01
0xbfa67f1f parent string = ''
Exit the parent process
0xbfa67f1f child string = 'Hello World'
Nebo mu to šoupni takhle, když se Ti nechce vytvářet rouru:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
system("echo 'ABC' |sed 's/ABC/abc/'");
return 0;
}
Něco jako:
if (fork() == 0)
{
char data[25]="Heslo";
fprintf (stdin,"%s",data);
exec ('/usr/bin/cat');
}
Případně méně šílená varianta:
if (fork() == 0)
{
char data[25]="Heslo";
FILE *f;
f = fmemopen(data, 25, "r");
freopen (f,"r",stdin);
exec ('/usr/bin/cat');
}
Tady je problém s tím, že freopen() potřebuje cestu k souboru, takže mu nemůžu podstrčit memstream...
pro duplikaci deskriptoru jsou funkce dup/dup2.
dup2(fd, 0); // fd -> 0
exec(...);
Tohle by se Ti mohlo líbit. Stejný příklad je v knížce "Linux začínáme programovat" v kapitole "Vzájemná komunikace mezi procesy: Roury" a části "Roury a funkce dup". Je to tam i pěkně vysvětleno.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define STRING_MAX 512
int main(int argc, char *argv[])
{
char string[STRING_MAX+1];
int pipes[2];
pid_t pid;
strcpy(string, "Hello World");
if (pipe(pipes) == 0) {
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
else if (pid > 0) {
close(pipes[0]);
write(pipes[1], string, strlen(string));
close(pipes[1]);
}
close(0);
dup(pipes[0]);
close(pipes[0]);
close(pipes[1]);
execlp("cat", "cat");
}
return 0;
}
Zásadní jsou tyto dva řádky:
close(0);
dup(pipes[0]);
Nejprve se zavře stdin a díky tomu pak následně volaná fce vytvoří kopii deskriptoru nastavenou na 0, protože je nový deskriptor vždy nejnižší možné číslo. V případě fce dup2() je nastaven na hodnotu předanou v druhém argumentu nebo nejbližší větší, v případě, že požadovaná hodnota je již využívána.
Diky za pomoc...
Díky moc za vyvedení z omylu. Máš pravdu, zmátla mě formulace v knize, jak v originále, tak překladu.
... zatímco v případě funkce dup2 je nový deskriptor shodný nebo první volný, který je větší než parametr newfd ...
... while in the case of dup2 it's the same as, or the first available descriptor greater than, the parameter newfd ...
Takže jim evidentně zmizel kus textu a mělo tam být něco jako:
If newfd is negative or greater than or equal to OPEN_MAX, the dup2() function returns a value of -1 and sets errno to EBADF.
V manuálové stránce to řekli hezky na rovinu:
dup2() makes newfd be the copy of oldfd, closing newfd first if necessary.
The call:
fid = dup2(fildes, fildes2);
is equivalent to:
close(fildes2);
fid = fcntl(fildes, F_DUPFD, fildes2);
with the following exceptions:
If fildes2 is negative or greater than or equal to OPEN_MAX, the dup2() function returns a value of -1 and sets errno to EBADF.
If fildes is a valid file descriptor and is equal to fildes2, the dup2() function returns fildes2 without closing it.
If fildes is not a valid file descriptor, dup2() fails and does not close fildes2.
If successful, dup2() returns a value that is equal to the value of fildes2.
If a failure occurs, it returns a value of -1.
Tiskni
Sdílej: