Zero Day Initiative zveřejnila informace o 6 bezpečnostních chybách (1, 2, 3, 4, 5, 6) v MTA Exim. Nejvážnější z nich CVE-2023-42115 má CVSS 9.8. Na opravě chyb se pracuje.
Knihovna libvpx byla vydána ve verzi 1.13.1. Řešena je kritická bezpečnostní chyba CVE-2023-5217 (heap buffer overflow in vp8 encoding). Chyba je již opravena také v Chrome / Chromium 117.0.5938.132 a Firefoxu 118.0.1.
Balíček kmod s nástroji pro práci s linuxovými moduly byl vydán ve verzi 31. Nově umí modprobe zavést modul nacházející se v libovolném adresáři (# modprobe ./drivers/gpu/drm/i915/i915.ko).
Adventura Trüberbrook je na portále GOG.com zdarma, akce trvá do 2. října.
Sound Open Firmware, projekt Linux Foundation, open source audio DSP firmware a SDK, byl vydán ve verzi 2.7.0. Z novinek lze vypíchnout podporu platformy AMD Van Gogh.
Richard Stallman v den oslav 40. výročí GNU oznámil, že má rakovinu (YouTube).
DIY trackball Ploopy má novou variantu Adept, na rozdíl od předchozích používá 44mm kouli, má symetrický tvar a šest tlačítek, snímač zůstává PMW-3360, novinkou je použití Raspberry Pi Pico, na kterém běží firmware QMK s podporou grafické konfigurační aplikace VIA. Předobjednávky jsou otevřeny za ceny 80-105 CAD.
Probíhá Meta Connect 2023. Společnost Meta představuje své novinky v oblasti AI a virtuální, smíšené a rozšířené reality. Představeny byly nové chytré brýle Ray-Ban | Meta a headset Meta Quest 3.
Eben Upton oficiálně představil (YouTube) nové Raspberry Pi 5 (YouTube). Je více než 2x výkonnější než jeho předchůdce, model 4B.
Byl vydán (YouTube) Counter-Strike 2. Nativně také pro Linux. Jedná se o největší technologický skok v historii této populární herní série.
Řešení dotazu:
…sleep(3) may be implemented using SIGALRM; mixing calls to alarm() and sleep(3) is a bad idea.…
Dala by se v hlavní programové smyčce nahradit funkce sleep za jiný mechanismus?Jinak na modernich jadrech by sel take pouzit cekani na timerfd, viz treba http://www.kernel.org/doc/man-pages/online/pages/man2/timerfd_create.2.html
sleep()
nebo nanosleep()
. Luboš měl ale IMHO na mysli to, že někdy autoři programů místo pasivního čekání na nějakou událost využívají smyčku, která se v pravidelných intervalech ptá, jestli už událost nastala. Při krátkém intervalu se tím zbytečně zatěžují zdroje, při dlouhém se zase prodlužuje reakční doba. Někdy to samozřejmě jinak dělat nejde, ale často se to z neznalosti nebo lenosti používá, i když mechanismy pro pasivní čekání existují.
nanosleep() podle manuálu pro krátké intervaly čekal aktivně
I kdyby ano, tady se bavíme o náhradě za sleep()
, takže o takový interval zcela určitě nejde.
Každopádně s prostředky pro sleep() bych si moc starostí nedělal, test jedné podmínky jednou za několik sekund (granularita funkce sleep) je zanedbatelná zátěž.
Tady si asi nerozumíme. Neměl jsem na mysli zátěž funkce sleep()
samotné, ale o ty periodické kontroly, tj. konstrukce typu
while (!ready()) { usleep(100); }
když na něco čekáte. Pokud ten interval bude příliš krátký, budou opakované kontroly příliš zatěžovat procesor (a možná i něco jiného). Bude-li příliš dlouhý, pak máte příliš dlouhou odezvu. Pokud existují prostředky, jak se nechat probudit až tehdy, když je podmínka splněná (a hned, jakmile je splněná), měla by jim být dána přednost.
Pokud ti přijde nějaký signál, sleep bude přerušen a ty nebudeš vědět jak dlouho ještě čekat.man sleep(3) rika neco jineho:
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.
int own_sleep (time_t seconds, time_t useconds) { #if LINUX struct timeval interval; if (seconds < 0) seconds = 0; if (useconds < 0) useconds = 0; if (seconds == 0 && useconds == 0) return -1; memset(&interval, 0, sizeof(interval)); interval.tv_sec = seconds; interval.tv_usec = useconds; return select (FD_SETSIZE, NULL, NULL, NULL, &interval); #endif #if !(defined __MINGW32__ || defined _MSC_VER) struct timeval now, deadline; gettimeofday (&deadline, NULL); #if 0 deadline.tv_usec += usec; deadline.tv_sec += deadline.tv_usec / 1000000; deadline.tv_usec %= 1000000; #else deadline.tv_sec += useconds; deadline.tv_usec += seconds; #endif do { gettimeofday (&now, NULL); } while ((now.tv_sec < deadline.tv_sec) || (now.tv_sec == deadline.tv_sec && now.tv_usec < deadline.tv_usec)); #else /* MinGW has no gettimeofday(). ftime() seems to be the best alternative as I * don't know of any standard Windows function with microsecond accuracy. I * should have a look at the Cygwin source code... - dbjh */ struct timeb tb; int32_t int now, deadline; ftime (&tb); deadline = tb.time * 1000 + tb.millitm + useconds / 1000; do { ftime (&tb); now = tb.time * 1000 + tb.millitm; } while (now < deadline); #endif }zakladni problem je v tom, ze kazde aktivni volani sleep, za pomoci dodatecnych funkci vytvari rezii na CPU a na volani prislusnych prostredku. Nejlepsi je pouziti timeoutu pro uvedeny select().
pthread_mutex_lock(mutex); clock_gettime(CLOCK_REALTIME, &abstime); abstime.tv_nsec += msec * 1000000; abstime.tv_sec += sec; if (abstime.tv_nsec > 1000000000UL) { abstime.tv_nsec %= 1000000000UL; abstime.tv_sec += 1; } rc = pthread_cond_timedwait(cond, mutex, &abstime); if (rc != ETIMEDOUT) WARN("Predcasny timeout (rc=%d)", rc); pthread_mutex_unlock(mutex);Před použitím se musely inicializovat proměnné "mutex" a "cond". Ale zase pomocí funkce pthread_cond_signal() šlo čekání okamžitě zrušit.
Tiskni
Sdílej: