Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.8. Novinky zahrnují lepší podporu vzdálené plochy, sdílení a nahrávání obrazovky a řadu drobností napříč uživatelským rozhraním (úplný seznam změn, shrnutí ve wiki).
Apple představil 7palcový displej Apple HomeView s podporou Apple Intelligence a Siri AI pro ovládání chytré domácnosti, novou řadu vybavení chytré domácnosti Apple Home Collection, další generaci HomePodu mini a novou Apple TV 4K. Apple HomeView není v Evropské unii v prodeji, jelikož umělá inteligence Siri v rámci systému iOS v EU momentálně není k dispozici. Apple spolupracuje s EU a snaží se najít cestu, jak situaci vyřešit.
KDE slaví 30 let. Přesně před 30 lety, 14. října 1996, poslal Matthias Ettrich do diskusní skupiny comp.os.linux.misc zprávu, která započala historii projektu KDE. Důležité milníky jsou zobrazeny na časové ose.
Byl vydán Mozilla Firefox 158.0. Stejně jako Chrome 155 s podporou JPEG XL (test). Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 158 bude brzy k dispozici také na Flathubu a Snapcraftu.
Svobodný kancelářský balík ONLYOFFICE (Wikipedie) byl vydán ve verzi 10.0. Jak online Docs, tak i offline Desktop Editors. Přehled novinek také na YouTube.
Mozilla představuje Firefox Enterprise určený jako podnikový prohlížeč pro organizace s přísnými požadavky na bezpečnost, správu a dodržování předpisů. S profesionální podporou. Dostupný je zatím ve Francii, Německu, Rakousku a Švýcarsku.
Kybernetický útok zasáhl nejméně 150 supermarketů Intermarché a několik prodejen řetězců Leclerc a Coopérative U. Chladicí jednotky napadených obchodních domů byly nastaveny na nepřetržité odmrazování a teplota v nich mnohdy vystouala až nad 50°C. Škody napáchané na chlazeném a mraženém zboží budou patrně dosahovat miliónů eur.
… více »Stát Kalifornie zažaloval výrobce 3D tiskových filamentů Polymaker. Vrchní soud San Diego County tvrdí, že firma propagací svých výrobků mezi příznivci 3D tištěných zbraní podporovala výrobu takzvaných 'ghost guns' (DIY zbraní) a že její PLA filament pro 3D tiskárny lze za těchto okolností považovat za součást určenou k výrobě střelné zbraně. Žaloba požaduje mimo jiné finanční sankce a soudní zákaz činnosti, Polymaker se hájí tím, že filament je běžný a sám o sobě legální produkt. Celý text žaloby (PDF na Google Drive).
V červnu byla představena aplikace Myna pro převod řeči na text v prostředí desktopu Ubuntu. Včera byla Myna zpřístupněna širší komunitě Ubuntu formou technologické ukázky dostupné v Ubuntu 24.04 LTS, Ubuntu 26.04 LTS a Ubuntu 26.10 s GNOME na Waylandu.
Ubuntu 27.04 bude Tenacious T-Rex.
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: