Mnoho systémových volání bude hlásit EINTR
chybový kód, pokud během systémového volání došlo k signálu. Ve skutečnosti nedošlo k žádné chybě, je to jen hlášeno tímto způsobem, protože systém není schopen automaticky obnovit systémové volání. Tento vzor kódování jednoduše zopakuje systémové volání, když k tomu dojde, aby se přerušení ignorovalo.
Například k tomu může dojít, pokud program používá alarm()
spustit nějaký kód asynchronně, když vyprší časovač. Pokud časový limit nastane, když program volá write()
, chceme jen zopakovat systémové volání (neboli čtení/zápis atd.).
odpovědi zde jsou opravdu dobré a chci přidat nějaké interní podrobnosti:
Systémová volání, která jsou přerušována signály, se mohou buď zrušit, nebo vrátit
EINTR
nebo se automaticky restartují pouze tehdy, kdyžSA_RESTART
je specifikováno vsigaction(2)
a ten, kdo za tento úkol odpovídá, je restart_block
který slouží ke sledování informací a argumentů pro restartování systémových volání
Z manuálové stránky na write
:
Hovor byl přerušen signálem před zápisem jakýchkoli dat