Cvičení 2 k mamce

Procesy a signály

Zadání

Napište program, který vypisuje každou sekundu číslo o 1 větší. Tento program po svém spuštění spustí dceřiný proces (budík), který ho za předem určený počet ms upozorní, pomocí signálu SIGALRM, že má skončit. Počet ms budíku zadejte z příkazové řádky při spouštění programu.

Trocha teorie

Procesy

Linuxový proces je program složený z jednoho nebo více vláken běžící ve vlastním paměťovém prostoru.

Každý proces má PID, svého předka a může mít i potomky, jinými slovy spuštěné procesy tvoří strom.

Po násilné smrti rodičovského procesu (např. signálem SIGKILL) umírají automaticky všechny jeho děti nebo děti adoptuje proces init.

Nový proces se zakládá voláním funkce fork(). Vzniká 2. identický dceřiný proces, vykonávající stejný kód, mající otevřeny stejné filedescriptory a vidící stejnou paměť. Pamět obou procesů je copy on write, to znamená, že je sice bezprostředně po forku identická, ale zápisem do ní, získává každý proces svoji separátní kopi. Fork sám o sobě by nebyl příliš šikovný, kdybychom neměli funkci exec(), která dokáže v procesu spustit jiný kód.

Chceme-li vypsat běžící procesy použijeme ps

Pro komunikaci mezi procesy se používají tyto prostředky:

Signály

Signály umožňují zasílat asynchronně ostatním procesům zprávu určitého typu.

Pro práci se signály slouží příkaz kill případně killall viz. man kill

Seznam všech signálů získáme pomocí kill -l

[fanda@lab3-2 fanda]$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 35) SIGRTMIN 36) SIGRTMIN+1 37) SIGRTMIN+2 38) SIGRTMIN+3 39) SIGRTMIN+4 40) SIGRTMIN+5 41) SIGRTMIN+6 42) SIGRTMIN+7 43) SIGRTMIN+8 44) SIGRTMIN+9 45) SIGRTMIN+10 46) SIGRTMIN+11 47) SIGRTMIN+12 48) SIGRTMIN+13 49) SIGRTMIN+14 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [fanda@lab3-2 fanda]$

Jak se posílají a odchytávají signály pomocí funkcí kill() a signal() ukazuje příklad 4

Pro odchytávání signálů existuje ještě robustnější rozhraní pomocí funkce sigaction()

Roury

Roura poskytuje jednosměrnou komunikaci mezi procesy, potřebujeme-li obousměrnou, natáhneme si roury 2.

Roury mohou být Příklad použití z příkazové řádky: cat /etc/passwd | grep novak najde uživatele novaka v seznamu uživatelů.

Příklady

Příklad 1, na čtení argumentů příkazové řádky.

Příklad 2, na funkci exec().

Příklad 3, na funkci fork(), wait(), kde jeden proces vytvoří jiný a pak čeká na jeho ukončení.

Příklad 4, na funkce signal(), kill(), kde jeden proces vytvoří jiný a pak jej signálem zabije.

Odkazy

Jako 1. věc doporučujeme prostudovat Procesy a signály v Unixu

  k mamce