Browse Source

doc: Fix klish-exec picture + text

Serj Kalichev 1 month ago
parent
commit
476a13684f
3 changed files with 75 additions and 30 deletions
  1. 30 30
      docs/klish-exec.ru.drawio
  2. BIN
      docs/klish-exec.ru.png
  3. 45 0
      docs/klish3.ru.md

+ 30 - 30
docs/klish-exec.ru.drawio

@@ -1,76 +1,76 @@
-<mxfile host="Electron" modified="2024-03-01T09:14:19.024Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="GX66rmi1SfxKNbaK89J-" version="23.1.5" type="device">
+<mxfile host="Electron" modified="2024-03-01T11:59:02.409Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="RdiGEUdahsl9itZxypQU" version="23.1.5" type="device">
   <diagram name="Страница — 1" id="UFjbOvR3O6Qe7gl92aNO">
-    <mxGraphModel dx="956" dy="605" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+    <mxGraphModel dx="470" dy="777" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
       <root>
         <mxCell id="0" />
         <mxCell id="1" parent="0" />
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-7" value="" style="whiteSpace=wrap;html=1;align=center;dashed=1;fillStyle=hatch;fillColor=#EBEBEB;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-7" value="" style="whiteSpace=wrap;html=1;align=center;dashed=1;fillStyle=hatch;fillColor=#EBEBEB;" parent="1" vertex="1">
           <mxGeometry x="40" y="110" width="640" height="290" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-1" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;Клиент klish&lt;/font&gt;" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-1" value="&lt;font style=&quot;font-size: 16px;&quot;&gt;Клиент klish&lt;/font&gt;" style="whiteSpace=wrap;html=1;align=center;" parent="1" vertex="1">
           <mxGeometry x="280" y="30" width="240" height="50" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-2" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;Основной цикл klishd&lt;/font&gt;" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-2" value="&lt;font style=&quot;font-size: 18px;&quot;&gt;Основной цикл klishd&lt;/font&gt;" style="whiteSpace=wrap;html=1;align=center;" parent="1" vertex="1">
           <mxGeometry x="80" y="150" width="560" height="90" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-3" value="&lt;b&gt;Исполнение символа&lt;br&gt;&lt;/b&gt;Синхронный символ&lt;br&gt;Без вывода в&lt;br&gt;&amp;nbsp;stdout, stderr" style="shape=ext;margin=3;double=1;whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-3" value="&lt;b&gt;Исполнение символа&lt;br&gt;&lt;/b&gt;Синхронный символ&lt;br&gt;Без вывода в&lt;br&gt;&amp;nbsp;stdout, stderr" style="shape=ext;margin=3;double=1;whiteSpace=wrap;html=1;align=center;" parent="1" vertex="1">
           <mxGeometry x="80" y="280" width="160" height="80" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-5" value="&lt;b&gt;Исполнение символа&lt;br&gt;&lt;/b&gt;Синхронный символ&lt;br&gt;С выводом в&lt;br&gt;&amp;nbsp;stdout, stderr" style="shape=ext;margin=3;double=1;whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-5" value="&lt;b&gt;Исполнение символа&lt;br&gt;&lt;/b&gt;Синхронный символ&lt;br&gt;С выводом в&lt;br&gt;&amp;nbsp;stdout, stderr" style="shape=ext;margin=3;double=1;whiteSpace=wrap;html=1;align=center;" parent="1" vertex="1">
           <mxGeometry x="280" y="280" width="160" height="80" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-6" value="&lt;b&gt;Исполнение символа&lt;br&gt;&lt;/b&gt;Асинхронный символ" style="shape=ext;margin=3;double=1;whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-6" value="&lt;b&gt;Исполнение символа&lt;br&gt;&lt;/b&gt;Асинхронный символ" style="shape=ext;margin=3;double=1;whiteSpace=wrap;html=1;align=center;" parent="1" vertex="1">
           <mxGeometry x="480" y="430" width="160" height="80" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-8" value="Процесс - приемник&lt;br&gt;stdout, stderr&lt;br&gt;от синхронного символа" style="whiteSpace=wrap;html=1;align=center;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-8" value="Процесс - приемник&lt;br&gt;stdout, stderr&lt;br&gt;от синхронного символа" style="whiteSpace=wrap;html=1;align=center;" parent="1" vertex="1">
           <mxGeometry x="280" y="430" width="160" height="80" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.167;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.167;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-1" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="390" y="810" as="sourcePoint" />
             <mxPoint x="320" y="150" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.167;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.167;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="320" y="80" as="sourcePoint" />
             <mxPoint x="320" y="150" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-11" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.716;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.835;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-2" target="W7FwdtZu-5o2vGSCx_RX-1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-11" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.716;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.835;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-2" target="W7FwdtZu-5o2vGSCx_RX-1" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="480" y="80" as="sourcePoint" />
             <mxPoint x="500" y="90" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-12" value="Обслуживающий сервер klishd" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-12" value="Обслуживающий сервер klishd" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="40" y="110" width="200" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-13" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.144;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-2" target="W7FwdtZu-5o2vGSCx_RX-3">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-13" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.144;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-2" target="W7FwdtZu-5o2vGSCx_RX-3" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="300" y="270" as="sourcePoint" />
             <mxPoint x="350" y="220" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-15" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.144;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-15" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.144;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="360.5" y="240" as="sourcePoint" />
             <mxPoint x="359.5" y="280" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-16" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.857;exitY=0.989;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-2">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-16" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.857;exitY=0.989;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-2" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="560.5" y="390" as="sourcePoint" />
             <mxPoint x="559.5" y="430" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-17" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.144;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" target="W7FwdtZu-5o2vGSCx_RX-8">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-17" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.144;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" target="W7FwdtZu-5o2vGSCx_RX-8" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="360.5" y="360" as="sourcePoint" />
             <mxPoint x="359.5" y="400" as="targetPoint" />
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-6">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-6" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="300" y="270" as="sourcePoint" />
             <mxPoint x="640" y="200" as="targetPoint" />
@@ -81,7 +81,7 @@
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-19" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.999;entryY=0.315;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-8" target="W7FwdtZu-5o2vGSCx_RX-2">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-19" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.999;entryY=0.315;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-8" target="W7FwdtZu-5o2vGSCx_RX-2" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="610" y="520" as="sourcePoint" />
             <mxPoint x="700" y="190" as="targetPoint" />
@@ -92,34 +92,34 @@
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-20" value="команда, stdin" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-20" value="команда, stdin" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="320" y="80" width="90" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-21" value="stdout, stderr" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-21" value="stdout, stderr" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="485" y="80" width="85" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-23" value="символ (sym)" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-23" value="символ (sym)" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="160" y="250" width="90" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-24" value="символ (sym)" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-24" value="символ (sym)" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="360" y="250" width="90" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-25" value="символ (sym),&lt;br&gt;stdin" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-25" value="символ (sym),&lt;br&gt;stdin" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="560" y="250" width="90" height="30" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-26" value="fork()" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-26" value="fork()" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="360" y="400" width="40" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-27" value="fork()" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-27" value="fork()" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="560" y="400" width="40" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-28" value="stdout, stderr" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-28" value="stdout, stderr" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="360" y="530" width="80" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-29" value="stdout, stderr" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-29" value="stdout, stderr" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="560" y="519" width="80" height="20" as="geometry" />
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-32" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.325;entryY=0.981;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="W7FwdtZu-5o2vGSCx_RX-3" target="W7FwdtZu-5o2vGSCx_RX-2">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-32" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.325;entryY=0.981;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="W7FwdtZu-5o2vGSCx_RX-3" target="W7FwdtZu-5o2vGSCx_RX-2" edge="1">
           <mxGeometry width="50" height="50" relative="1" as="geometry">
             <mxPoint x="300" y="350" as="sourcePoint" />
             <mxPoint x="350" y="300" as="targetPoint" />
@@ -129,7 +129,7 @@
             </Array>
           </mxGeometry>
         </mxCell>
-        <mxCell id="W7FwdtZu-5o2vGSCx_RX-33" value="текстовая строка" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
+        <mxCell id="W7FwdtZu-5o2vGSCx_RX-33" value="текстовая строка" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
           <mxGeometry x="160" y="360" width="90" height="30" as="geometry" />
         </mxCell>
       </root>

BIN
docs/klish-exec.ru.png


+ 45 - 0
docs/klish3.ru.md

@@ -186,6 +186,51 @@ shell скрипты, но и скрипты на других интерпре
 Символы бывают "синхронные" и "асинхронные". Синхронные символы исполняются
 в адресном пространстве klishd, для асинхронных порождается отдельный процесс.
 
+Асинхронные символы могут принимать на вход (stdin) пользовательский ввод,
+получаемый обслуживающим сервером klishd от клиента по протоколу KTP и
+пересылаемый порожденному процессу, в рамках которого выполняется асинхронный
+символ. В свою очередь асинхронный символ может писать в потоки stdout, stderr.
+Данные из этих потоков получает обслуживающий сервер klishd и пересылает
+клиенту по протоколу KTP.
+
+Синхронные символы (с выводом в stdout, stderr) не могут получать данные через
+входной поток stdin, так как они выполняются в рамках обслуживающего сервера
+klishd и, на время выполнения кода символа, другие функции сервера
+временно останавливаются. Останавливается прием данных от клиента. Обслуживающий
+сервер klishd является однопоточной программой, поэтому синхронные символы надо
+использовать с осторожностью. Если символ будет выполняться слишком долго, то
+сервер зависнет на это время. Кроме этого синхронные символы выполняются в
+адресном пространстве сервера. Это означает, что выполнение неотлаженного
+символа, содержащего ошибки, может привести к падению обслуживающего сервера.
+Хотя синхронный символ не имеет входного потока stdin, он может использовать
+выходные потоки stdout, stderr. Для получения данных из этих потоков и
+последующей отправки их клиенту, обслуживающий сервер порождает служебный
+процесс, который получает и временно хранит данные, поступающие от символа. При
+завершении выполнения символа, служебный процесс пересылает сохраненные данные
+обратно обслуживающему серверу, который, в свою очередь, отправляет их клиенту.
+Синхронные символы рекомендуется использовать только тогда, когда символ меняет
+состояние обслуживающего сервера и поэтому не может быть выполнен в рамках
+другого процесса. Например, навигация по секциям (см. Области видимости)
+реализована синхронным символом, т.к. положение пользователя в дереве секций
+сохраняется в обслуживающем сервере.
+
+Облегченные синхронные символы не имеют входного и выходных потоков данных
+stdin, stdout, stderr. За счет этого, выполнение такого символа не требует
+порождения новых процессов, как это делается в случае обычного синхронного
+символа, либо асинхронного символа. Таким образом облегченный синхронный символ
+выполняется максимально быстро. Хотя облегченный синхронный символ не имеет
+потока stdout, он может сформировать выходную текстовую строку.
+Строка формируется вручную и, с помощью специальной функции, передается
+обслуживающему серверу, который может отправить её клиенту в качестве stdout.
+В остальном облегченный синхронный символ имеет теже особенности, что и обычный
+синхронный символ. Облегченные синхронные символы рекомендуется использовать
+тогда, когда требуется максимально быстрое выполнение. Примером такой задачи
+может служить формирования приглашения (prompt) пользователя. Это служебная
+функция, которая выполняется каждый раз, когда пользователь нажимает кнопку
+ввода. Еще один пример использования - функции проверки, является ли
+введенный пользователем аргумент допустимым (см. PTYPE), а также функции для
+формирования автодополнения и подсказок.
+
 ![Фильтры](/klish-filters.ru.png "Фильтры")