50 likes | 172 Views
8. 3. 2012. popen() spustí príkaz typicky výstup je presmerovaný na filedeskriptor a možno z neho čítať aj zapisovať |: štandardný výstup sa presmeruje na štandardný vstup. ps faxu | grep root spustí sa ps ten fork()ne na 2 separátne ps , ten druhý hneď execve()-ne grep
E N D
popen() spustí príkaz • typicky výstup je presmerovaný na filedeskriptor a možno z neho čítať • aj zapisovať • |: štandardný výstup sa presmeruje na štandardný vstup
ps faxu | grep root • spustí sa ps • ten fork()ne na 2 separátne ps, ten druhý hneď execve()-ne grep • exec*() prepíše časť so strojovým kódom • časť .text • 2 typy rúr • nepomenované • pomenované
| - nepomenovaná rúra • kernel vyčlení kus pamäte na výmenu dát • bajtovo orientované • stream • pri rúrach limitiy pre buffer • minimum: stránka (4kB) • maximum: závisí od operačného systému / kernelu • 2.6: 65 535 B (64 kB) • teraz: 1MB
v /proc/sys/fs/pipe-max-size • od kernelu 2.6.35 • buffer umožňuje atomicitu operácie • väčší buffer smeruje k menšej frekvencii prepínania kontextu čítajúcich procesorov • buffer sa nemusí vypĺňať sekvenčne • pri viaceých procesoch treba kontrolovať max veľkosť buffera • inak náhodné chyby