Byl vydán LineageOS 23.2 (Mastodon). LineageOS (Wikipedie) je svobodný operační systém pro chytré telefony, tablety a set-top boxy založený na Androidu. Jedná se o nástupce CyanogenModu.
Od března budou mít uživatelé Discordu bez ověření věku pouze minimální práva vhodná pro teenagery.
Evropská komise (EK) předběžně shledala čínskou sociální síť pro sdílení krátkých videí TikTok návykovým designem v rozporu s unijním nařízením o digitálních službách (DSA). Komise, která je exekutivním orgánem Evropské unie a má rozsáhlé pravomoci, o tom informovala v tiskovém sdělení. TikTok v reakci uvedl, že EK o platformě vykreslila podle něj zcela nepravdivý obraz, a proto se bude bránit.… více »
Offpunk byl vydán ve verzi 3.0. Jedná se o webový prohlížeč běžící v terminálu a podporující také protokoly Gemini, Gopher a RSS. Přibyl nástroj xkcdpunk pro zobrazení XKCD v terminálu.
Promethee je projekt, který implementuje UEFI (Unified Extensible Firmware Interface) bindingy pro JavaScript. Z bootovacího média načítá a spouští soubor 'script.js', který může používat UEFI služby. Cílem je vytvořit zavaděč, který lze přizpůsobit pomocí HTML/CSS/JS. Repozitář se zdrojovými kódy je na Codebergu.
Zpráva Justičního výboru Sněmovny reprezentantů upozorňuje na cenzurní kampaň Evropské komise, mířenou proti svobodě projevu na sociálních sítích. V dokumentu se uvádí, že se Evropská komise během posledních šesti let účastnila více než 100 uzavřených jednání, během nichž po platformách požadovala úpravy pravidel moderování obsahu, přičemž toto úsilí Komise zahrnovalo i cenzuru politických názorů a pravdivých informací. Výbor zdůrazňuje, že tento přístup Bruselu ohrožuje ústavou zaručená práva Američanů na svobodu projevu.
Linus Torvalds vydal jádro Linux 6.19. Podrobný výčet změn je ke zhlédnutí na stránce Kernel Newbies, stručné výběry v LWN (část první, druhá).
Do prodeje jde tichá bezdrátová herní myš Logitech PRO X2 SUPERSTRIKE s analogovými spínači s haptickou odezvou (HITS, Haptic Inductive Trigger System). Cena je 4 459 Kč.
Microsoft na GitHubu zveřejnil zdrojový kód projektu LiteBox, jedná se o 'knihovní operační systém' (library OS) zaměřený na bezpečnost, využívající systémovou architekturu LVBS k ochraně jádra před útoky z uživatelského prostoru. LiteBox je napsán v Rustu a uvolněný pod licencí MIT. Projekt je teprve v rané fázi vývoje.
BreezyBox je open-source shell a virtuální terminál pro populární jednočip ESP32. Nabízí základní unixové příkazy, sledování aktuálního pracovního adresáře (CWD), jednoduchý instalátor a spouštěč aplikací v podobě ELF binárních souborů, zabudovaný HTTP server nebo třeba ovládání WiFi - ukázka použití coby 'malého osobního počítače'. Ačkoliv je BreezyBox inspirovaný BusyBoxem, oproti němu má tento projekt několik externích závislostí, zejména na ESP-IDF SDK. BreezyBox je dostupný pod licencí MIT.
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: