Hlavní navigace

Programování pod Linuxem pro všechny (9)

Jakub Matys

V dnešním dílu se podíváme na plánování procesů pomocí funkce a příkazu nice. Najdete zde také výpis nejpoužívanějších signálů a naučíte se signály odesílat procesům.

Plánování procesů

Operační systém Linux umožňuje zpracovávat více procesů najednou. Pokud máte k dispozici jen jeden procesor, může zpracovat kód jen jednoho procesu za časový úsek. To, že můžete mít naráz spuštěno více programů (procesů), je umožněno neustálým přepínáním procesů v procesoru. Nikdo však nezaručuje, jak dlouho bude procesor zpracovávat proces. Pokud budete mít program realizovaný dvěma procesy, nebude zaručeno, zda bude dříve zpracován první, nebo druhý proces. Může se také stát, že volající proces bude ukončen dříve než proces volaný. Linux však garantuje, že každý proces bude nakonec spuštěn a žádný proces nebude ochuzen o systémové prostředky.

U každého procesu můžete specifikovat, jestli je více, či méně důležitý. Každému procesu je totiž přiřazeno číslo(niceness) specifikující jeho prioriu. Rozsah čísel je od 20 do –20. Čím je číslo vyšší, tím nižší prioritu proces má. Procesy mající zápornou hodnotu niceness mají vysokou prioritu a systém jim přiděluje delší čas procesoru. Implicitně mají všechny procesy přiřazno číslo 0. Zvyšovat prioritu procesu může jen uživatel root, vy svým procesům můžete prioritu jen snižovat.

Snížit prioritu spouštěného programu můžete příkazem nice, např. nice -n 10 backup. V programu můžete použít stejnojmenou funkci, jejím parametrem je celočíselná hodnota požadované priority (-20 – 20). Pokud nastane chyba (nejste root), vrací funkce –1 a nastaví proměnnou errno. Hodnotou této proměnné je EPERM, což znamená, že nemáte dostatečná práva. Funkce je deklarována v hlavičkovém souboru unistd.h.

Signály

Přehled nejpoužívanějších signálů

Jména zde uvedených signálů jsou definována pomocí maker, pokud je budete chtít používat, vkládejte do svých zdrojových kódů hlavičkový soubor signal.h. Skutečné definice jsou uvedeny v souboru /usr/include/sys/sig­num.h, který je vložen kauzulí #include do souboru signal.h. Kompletní seznam signálů naleznete v manuálových stránkách (man 7 signal).

  • SIGHUP – Systém odešle tento signál, pokud byl odpojen terminál. Spousta programátorů pokužívá signál k jiným účelům (většinou k signalizaci znovunačtení konfiguračních souborů)
  • SIGINT – Tento signál bude odeslán procesu po stisknutí kombinace kláves Ctrl+C
  • SIGILL – Tento signál obdrží proces, který se pokusil provést neplatnou instrukci. Také to může znamenat, že je poškozen zásobník programu.
  • SIGABRT – Funkce abort() tento signál odešle volajícímu procesu.
  • SIGFPE – Proces realizoval neplatnou matematickou operaci v pohyblivé řádové čárce.
  • SIGKILL – Okamžité ukončení proccesu. Signál nelze ošetřit obslužnou funkcí.
  • SIGUSR1 – Rezervováno pro využití v aplikacích.
  • SIGUSR2 – -//-
  • SIGSEGV – Program se pokusil o neplatné zpřístupnění paměti. Přístup může být uplatňován na neplanou adresu virtuálního adresového prostoru, nebo může být zakázán přístupovými právy. Signál může být také způsoben dereferencí „divokého ukazatele“.
  • SIGPIPE – Program se pokusil zpřístupnit nefunkční proud dat, jako je např. síťové spojení, které bylo uzavřeno.
  • SIGTERM – Tento signál ukončuje proces. Jedná se o implicitní signál vysílaný příkazem kill.
  • SIGCHLD – Systém tento signál odesílá při ukončení podřízeného procesu. Jeho pomocí lze asynchronně odstraňovat podřízené procesy (bude probráno v dalším dílu).
  • SIGXCPU – Proces signál obdrží, pokud překročil jemu vymezený časový limit.

Ukončování procesů – kill

Standardním způsobem se proces ukončuje buď zavoláním funkce exit(), anebo opustěním main(). Pokud chcete proces ukončit „zvenčí“, můžete použít příkaz kill (funkce, která toto obslouží z vašeho programu, má stejné jméno a proberu ji o pár řádků níž). Parametrem příkazu je signál, který se má procesu předat (implicitně SIGTERM), musí mu předcházet pomlčka („-“) a PID procesu, kterému chcete signál poslat. Tento příkaz se dá použít k odeslání jakéhokoliv signálu, stačí jen zadat jeho číslo nebo jméno. Příklad shození procesu:

% kill -KILL pid     #nebo kill -9 pid

V programu můžete použít systémové volání kill(). Pokud ho budete používat, musíte includovat do vašeho zdrojového kódu hlavičkové soubory sys/types.h a signal.h. Prvním argumentem systémového volání je PID procesu, kterému chcete poslat signál, druhým pak samotný signál. Systémové volání vrací 0, pokud vše proběhlo v pořádku. Pokud ne, vrací –1 a nastaví proměnnou errno (více viz man 2 kill).

int kill(pid_t pid, int sig);

Následující tabulka ukazuje, jak mohou změnit chování různé hodnoty pid:

  • kladné číslo – Pošle signál procesu pid.
  • 0 – Odešle signál všem procesům v procesové skupině daného volajícího procesu.
  • –1 – Odešle signál všem procesům vyjma procesu volanícího.
  • menší než –1 – Signál je odeslán všem procesům v procesové skupině -pid.

To by bylo pro dnešek vše. Příště se podíváme na systémové volání wait (čekání na ukončení procesu) a povíme si něco o asynchroním odstraňování podřízených procesů (pomocí signálu SIGCHLD).

Našli jste v článku chybu?

22. 3. 2004 14:04

pet (neregistrovaný)

1) Dokumentaci a zdrojak ncruses mam nacteny davno a resizeterm() pochopitelne pouzivam. :) Neptal bych se aniz bych byl "v koncich". ungetch() v signal handleru z nepochopitelnych duvodu nejde, prestoze ncursi handler to dela prave tak. getch() si nevsimne.

2) jasne, select nebo varianta sleep. myslel jsem jestli neni pod Linuxem nejaka jina moznost. diky

3) ditto.

Diky za odpoved!







21. 3. 2004 23:50

Petr Baudis (neregistrovaný)

Doporucuji vam dokumentaci k resizeterm(3X). Slo by asi treba proste v signal handleru ungetch()nout KEY_RESIZE, a dalsi getch() by si toho melo vsimnout.

Co se tyce toho, aby smycky nezraly 99% CPU, lze tomu predejit obecne tak, ze do te smycky umistete nejaky bod, ve kterem se jadro muze zastavit, dokud se nestane "neco zajimaveho", na co cekate.

Napriklad pokud se chcete zastavit, dokud nedostanete nejaky signal, muzete pouzit pause(). Ve vasem pripade ale spise cekate, dokud se neco ne…



DigiZone.cz: „Black Friday 2016“: závěrečné zhodnocení

„Black Friday 2016“: závěrečné zhodnocení

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: I církev dnes vyrábí potraviny

I církev dnes vyrábí potraviny

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy