{"id":292160,"date":"2019-07-16T21:00:23","date_gmt":"2019-07-16T21:00:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=292160"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=292160","title":{"rendered":"Hello, World! \u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p><a href=\"https:\/\/habr.com\/ru\/post\/460257\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ha\/5f\/0v\/ha5f0vjiijc9c92bnnt56z7jcpg.jpeg\"><\/a><\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u0435\u043d\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/438044\">\u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0431 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0421\u0438\u0448\u043d\u043e\u0433\u043e printf<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0430\u043c \u0431\u044b\u043b \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0439 \u043f\u0443\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0447\u0435\u0442 \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f Terminal \u043e\u0442 Shell, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Pseudoterminal, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"osnovy\">\u041e\u0441\u043d\u043e\u0432\u044b<\/h2>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Terminal, Shell, Console, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f Terminal Emulator \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Terminal \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0442\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u043d. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u044b \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0443\u0441\u043b\u044b\u0448\u0438\u0442\u0435. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u043b\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u041a\u0442\u043e \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u0432\u0435\u0449\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442, \u043c\u043e\u0436\u0435\u0442 \u0441\u043c\u0435\u043b\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"terminal\">Terminal<\/h3>\n<p>  <\/p>\n<p><strong>Terminal (\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b)<\/strong> \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0414\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b \u0441\u0442\u0430\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439, \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043d\u0435\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c teleprinter (teletype, teletypewriter \u0438\u043b\u0438 TTY \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e), \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0430 \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b. \u041e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0437\u0430 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c, \u043f\u0440\u0438\u0447\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0432\u044b\u0434\u0435\u043b\u044f\u043b\u0430\u0441\u044c \u0441\u0432\u043e\u044f \u0441\u0435\u0441\u0441\u0438\u044f, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445. \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0431\u044b\u043b \u043d\u0430\u0437\u0432\u0430\u043d \u0442\u0430\u043a \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u0431\u0435\u043b\u044f (terminal end).<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e <strong>Teletype<\/strong>:<\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/m3\/_3\/yt\/m3_3ytmmoofzwgpr3dpu78w8m7i.jpeg\" alt=\"Teletype\" title=\"Teletype\" width=\"430\" height=\"370\"><\/p>\n<p>\u0410 \u044d\u0442\u043e <strong>Terminal<\/strong>:<\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pz\/lj\/eu\/pzljeumccjvqmrunt-pqolnyx-c.jpeg\" alt=\"Terminal\" title=\"Terminal\" width=\"430\" height=\"370\"><\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"console\">Console<\/h3>\n<p>  <\/p>\n<p><strong>Console (\u043a\u043e\u043d\u0441\u043e\u043b\u044c)<\/strong> \u2014 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0431\u044b\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043d\u0435\u044f\u0432\u043d\u043e, \u043d\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0431\u044b\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443. \u041a\u043e\u043d\u0441\u043e\u043b\u044c \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u0440\u0443\u0433\u0443 \u043b\u0438\u0446, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"shell\">Shell<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0434\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c\u0443 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044e.<\/p>\n<p>  <\/p>\n<p><strong>Shell<\/strong> \u2014 \u044d\u0442\u043e command line interpreter. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 Shell&#8217;\u043e\u0432. \u0421\u0430\u043c\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Bash (\u0447\u0442\u043e \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Bash\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f<\/a>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043b\u0430\u043c\u0431\u0443\u0440\u043e\u043c \u0434\u043b\u044f \u00abBorn again\u00bb Shell, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u0432\u043e\u0437\u0440\u043e\u0436\u0434\u0451\u043d\u043d\u044b\u0439\u00bb Shell). \u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b: Dash (\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 Shell, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \/bin\/sh), Zsh.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b, \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a <em>Terminal Emulator<\/em> \u0438 <em>Virtual Console<\/em>.<\/p>\n<p>  <\/p>\n<h3 id=\"terminal-emulator\">Terminal Emulator<\/h3>\n<p>  <\/p>\n<p><strong>Terminal Emulator<\/strong> \u2014 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u0431\u0440\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u042d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 X Window System \u2014 Bash, Vim \u0438 \u043f\u0440\u043e\u0447\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440<\/li>\n<li>\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0438 \u043d\u0430\u0448 Terminal Emulator \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435: \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0432\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043c\u044b\u0441\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u2014 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u043b\u043e\u0439, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434. \u041f\u0440\u0438\u043c\u0435\u0440\u044b Terminal Emulator: gnome-terminal, xterm, konsole.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0448\u0443 \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c Shell \u0438 Terminal Emulator!<\/strong><br \/>  Terminal Emulator \u2014 GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043a\u043d\u043e \u0432 X Windows System. Shell \u2014 \u044d\u0442\u043e command line interpreter, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u0430\u043d\u0434, \u043e\u043d \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438. \u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0432\u044b <strong>\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 Bash<\/strong>, \u0432\u044b <strong>\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 Terminal Emulator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f Bash<\/strong>. Terminal Emulator \u0438 Bash \u2014 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e 2 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u0435\u0440\u0432\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430 \u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434, \u0432\u0442\u043e\u0440\u0430\u044f \u2014 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"virtual-console-virtual-terminal\">Virtual Console (Virtual Terminal)<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl+Alt+FN, \u0433\u0434\u0435 N, \u043e\u0431\u044b\u0447\u043d\u043e, \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 1 \u0434\u043e 6. \u0422\u043e, \u0447\u0442\u043e \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0438\u0434\u0435\u043b\u0438 \u2014 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Virtual Console (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c) \u0438\u043b\u0438 Virtual Terminal (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b). \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u0435\u0435 \u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u0445? \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0431\u044b\u043b\u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0431\u044b\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0435\u0439, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445. Virtual Console \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u044d\u0442\u0443 \u0438\u0434\u0435\u044e: \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439 (\u043e\u0434\u043d\u0430\u043a\u043e, \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0432\u0441\u0435 \u0436\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043e\u0431\u0449\u0438\u0435). <\/p>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a Virtual Console, \u0442\u0430\u043a \u0438 Virtual Terminal, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u2014 \u044d\u0442\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443, \u043d\u043e \u0432\u0435\u0434\u044c \u0432\u0441\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0443.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"tty-ustroystva\">TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435 <em>TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/em> (\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. \u0425\u043e\u0442\u044f \u0442\u0435\u043b\u0435\u0442\u0430\u0439\u043f\u044b \u0432\u044b \u0432\u0440\u044f\u0434 \u043b\u0438 \u0443\u0436\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0435, \u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 TTY \u0434\u043e\u0448\u043b\u043e \u0438 \u0434\u043e \u043d\u0430\u0448\u0438\u0445 \u0434\u043d\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<ol>\n<li><strong>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/strong>. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438 \u0437\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d.<\/li>\n<li><strong>TTY Line Discipline<\/strong> (\u0440\u0443\u0441. \u2014 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438). \u0414\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u2014 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u043c\u0430\u043b\u043e \u0432 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443. \u041a\u0430\u043a\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0445\u043e\u0434\u0443 \u0441\u0442\u0430\u0442\u044c\u0438.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u043e\u0435\u043d\u0438\u0435 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zn\/zw\/dy\/znzwdyjadyeidyogqoap8kfvgng.jpeg\" title=\"\u0421\u0442\u0440\u043e\u0435\u043d\u0438\u0435 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\"><\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 3 \u0442\u0438\u043f\u0430 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432:<\/p>\n<p>  <\/p>\n<ol>\n<li><em>Console device<\/em> \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 Virtual Console. \u0412\u0432\u043e\u0434 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0434\u0440\u043e\u043c.<\/li>\n<li><em>PTY device<\/em> (\u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b) \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432 \u043e\u043a\u043e\u043d\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u0412\u0432\u043e\u0434 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435.<\/li>\n<li><em>Serial device<\/em> \u2014 \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0436\u0435\u043b\u0435\u0437\u043e\u043c. \u041e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a \u0441\u0430\u043c\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u0435 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u0445.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"tty-line-discipline\">TTY Line Discipline<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430. \u042d\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0441\u043c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B8%D0%B5_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B\" title=\"\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b\">\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/a>) \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u0432\u0432\u043e\u0434\u0438\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u043a\u0441\u0442, \u043d\u043e \u0432\u0434\u0440\u0443\u0433 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u044d\u0442\u043e \u0441\u0442\u0435\u0440\u0435\u0442\u044c \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u0432 \u0434\u0435\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432 Bash, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c <em>\u044d\u0445\u043e (echoing)<\/em>. \u042d\u0445\u043e \u2014 \u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432\u0430\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0441\u0438\u043c\u0432\u043e\u043b <code>a<\/code>, \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0432 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041e\u043d\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u0441\u0432\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440, \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0440\u0435\u0436\u0438\u043c <code>echo<\/code> \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041f\u0443\u0441\u0442\u044c \u043c\u044b \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <code>backspace<\/code> \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435. \u0421\u0438\u043c\u0432\u043e\u043b <code>^?<\/code> \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438, \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f, \u043f\u043e\u043d\u0438\u043c\u0430\u044f, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 \u0441\u0442\u0435\u0440\u0435\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u0441\u0442\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0442\u0430\u043a\u0436\u0435 \u0441 \u044d\u043a\u0440\u0430\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430\u0436\u043c\u0435\u043c Enter, TTY Line Discipline \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0448\u043b\u0435\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0441\u0435, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0440\u0430\u043d\u043d\u0435\u0435 \u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f LF. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b CR \u0438 LF \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u2014 \u044d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f <code>Enter<\/code>, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0432\u043e\u0434.<\/p>\n<p>  <\/p>\n<h3 id=\"tty-line-editing\">TTY Line Editing<\/h3>\n<p>  <\/p>\n<p><strong>TTY Line Editing<\/strong> \u2014 \u044d\u0442\u043e \u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430 \u0432 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0435 \u043b\u0438\u043d\u0438\u0438. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e <em>Line Editing<\/em> \u2014 \u044d\u0442\u043e \u043e\u0431\u0449\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043e\u043d\u043e \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0443 \u0432\u0432\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Bash \u0438 Vim \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439 Line Editing.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b <strong>stty<\/strong>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 Bash \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 Shell \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">stty icanon -echo<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0432\u0435\u0441\u0442\u0438 \u2014 \u0438 \u0432\u044b \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u0432\u0432\u043e\u0434\u0430 (\u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u0442\u0435\u0441\u044c, \u0432\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0432\u043e\u0434 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443). \u0412\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u044d\u0445\u043e \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0432\u0435\u0434\u0438\u0442\u0435: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">stty raw echo<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0432\u043e\u0434\u0438\u0442\u044c. \u0412\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0432\u043e\u0434. \u041d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0439\u0434\u0435\u043c \u0432 Dash \u2014 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 <code>\/bin\/sh<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043a\u043b\u0430\u0432\u0438\u0448\u0430 <code>Ctrl<\/code> + \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435) \u0438\u043b\u0438 \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u044c <code>Enter<\/code>. \u0412\u044b \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0435 \u2014 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b, \u0437\u0430\u0439\u0434\u044f \u0432 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 Shell, \u043a\u0440\u043e\u043c\u0435 Line Editing \u0441\u0430\u043c\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0442\u0430\u043a\u0436\u0435 Line Editing Bash, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0432\u0441\u044e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <em>raw<\/em> \u0440\u0435\u0436\u0438\u043c\u0430 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438. \u0414\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430 \u0438 \u043d\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0432\u043e\u0434. \u0417\u0430\u0447\u0435\u043c raw \u0440\u0435\u0436\u0438\u043c \u043d\u0443\u0436\u0435\u043d? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f <em>Vim<\/em>: \u043e\u043d \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0451 \u043e\u043a\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430, \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0441 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u0433\u043e Vim.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>stty &lt;control-character&gt; &lt;string&gt;<\/code>.<br \/>  \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 Bash:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">stty erase 0<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b <code>erase<\/code> \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b <code>0<\/code>. \u041a\u043d\u043e\u043f\u043a\u0430 <code>backspace<\/code> \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>^?<\/code>, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u0430\u043c\u0438. \u0421\u0442\u0438\u0440\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0436\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043a\u0438 <code>0<\/code> \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435, \u0432\u0435\u0434\u044c \u0432\u044b \u0441\u0430\u043c\u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 tty line discipline \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u043e\u0432\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b <code>erase<\/code>. \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>stty erase ^\\?<\/code> \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0432\u0435\u0434\u044c \u043c\u044b \u0432\u043b\u0438\u044f\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 tty \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/www.freebsd.org\/cgi\/man.cgi?query=stty&amp;sektion=1&amp;apropos=0&amp;manpath=FreeBSD+12.0-RELEASE+and+Ports\" title=\"man stty\">man stty<\/a>.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"terminal-emulator-i-pseudoterminal\">Terminal Emulator \u0438 Pseudoterminal<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 X Window System, GNOME Terminal Server \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432 \u043d\u0451\u043c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041e\u0431\u044b\u0447\u043d\u043e, \u044d\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e Shell (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Bash). <\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <strong>Pseudoterminal<\/strong> (\u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, PTY). \u0421\u0430\u043c \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u044f\u0434\u0440\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0432\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u2014 \u0438\u0437 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0432\u0443\u0445 <em>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432<\/em>:<br \/>  1) <strong>PTY master (PTM)<\/strong> \u2014 \u0432\u0435\u0434\u0443\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f GNOME Terminal Server \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439. GNOME Terminal Server \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 X Window System \u043f\u043e X \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443.<br \/>  2) <strong>PTY slave (PTS)<\/strong> \u2014 \u0432\u0435\u0434\u043e\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0442\u0430\u043a \u0434\u0443\u043c\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 (\u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u0435\u0435).<\/p>\n<p>  <\/p>\n<p>\u041b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0432\u043e\u0434\u043e\u043c PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0430 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u0418 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u043b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0432\u043e\u0434\u043e\u043c PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 GNOME Terminal Server \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<br \/>  1) GNOME Terminal Server \u0441\u043e\u0437\u0434\u0430\u0435\u0442 master \u0438 slave \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 open() \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 <strong>\/dev\/ptmx<\/strong>. \u0412\u044b\u0437\u043e\u0432 open() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2014 <em>master_fd<\/em>.<br \/>  2) GNOME Terminal Server \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fork()<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c.<br \/>  3) \u0412 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u0445 0, 1, 2 (stdin, stdout \u0438 stderr \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e). \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432\u0435\u0434\u0443\u0442 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<br \/>  4) \u0412 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>exec()<\/code>. \u041e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e Shell (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Bash). \u041b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0430\u044f \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0438\u0437 Bash, \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u0435 \u0436\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b, \u0447\u0442\u043e \u0438 \u0441\u0430\u043c Bash, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0443\u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>ls -la \/proc\/self\/fd<\/code>:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nr\/dx\/97\/nrdx97wllflvapnt76p3qqki3fw.jpeg\"><\/p>\n<p>  <\/p>\n<p>PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u0443\u0442\u0438 <strong>\/dev\/pts\/N<\/strong>, \u0430 \u043f\u0443\u0442\u044c \u043a PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043d\u0430\u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e GNOME Terminal Server \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0435\u043c\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>open()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u044f \u0441\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0443\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e PTS \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <em>\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c<\/em> (TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c), \u043d\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0430 \u0441 master \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 \u0432\u044b\u0432\u043e\u0434 \u0438\u0434\u0435\u0442 \u043d\u0435 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439, \u0430 \u043d\u0430 master \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043d\u0430\u0437\u0432\u0430\u043d \u0442\u0430\u043a \u2014 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043b\u0438\u0448\u044c \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442 (\u043e\u043f\u044f\u0442\u044c??) \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b. \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u2014 \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043a\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u043e, \u0447\u0442\u043e <em>PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c<\/em> \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e. \u0412\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u0445\u0430, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\/\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430.<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0437\u043d\u0430\u044f, \u0447\u0442\u043e \u043a \u043d\u0435\u0439 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b), \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0438 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0432\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c.<\/li>\n<li>\u0417\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 TTY Line Discipline, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u0434\u043e\u0439\u0434\u0443\u0442 \u0434\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u043e\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u043e\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0432 raw \u0440\u0435\u0436\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 PTS \u043a PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u044b\u0437\u043e\u0432\u044b <code>read()<\/code> \u0438 <code>write()<\/code> \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u044b\u0433\u0440\u0430\u0435\u0442 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u043e\u043b\u044c, \u043a\u0430\u043a \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0449\u0435\u043d\u0438\u044f GNOME Terminal Server \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jz\/y0\/sg\/jzy0sg0zjcceaflg6wyg7d5lkti.jpeg\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0449\u0435\u043d\u0438\u044f GNOME Terminal Server \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0433\u0440\u0430\u0435\u0442 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u0435\u0438\u043c\u0438 \u0447\u0430\u0441\u0442\u044f\u043c\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u0417\u0434\u0435\u0441\u044c \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445, <em>\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043e\u0442 PTM \u043a PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443<\/em>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. <em>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043c\u044b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442<\/em>.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"virtualnye-ustroystva\">\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/h2>\n<p>  <\/p>\n<p>\u0412\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u043f\u043e \u043f\u0443\u0442\u0438 <em>\/dev\/pts\/N<\/em> \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e, \u043a\u0430\u043a \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430? \u0414\u0430, \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 Unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 Unix, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u0430\u043d\u0433\u043b. \u2014 device file) \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438. \u0422\u0430\u043a\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <strong>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438<\/strong> (virtual device) \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u043d\u0435 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>write()<\/code> \u0438 <code>read()<\/code>, \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e. <\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0434\u0432\u0430 \u043e\u043a\u043d\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>tty<\/code>. \u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a\u043e\u0435 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0432\u0435\u0434\u0438\u0442\u0435 <code>echo \"Hello, World!\" &gt; \/dev\/pts\/N<\/code> \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0433\u0434\u0435 N \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u0441\u044c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043e\u043a\u043d\u043e \u2014 \u0438 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0430\u0448 \u0432\u0432\u043e\u0434 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0442\u0430\u043a, <em>\u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0432 \u0442\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435<\/em>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nj\/3s\/rp\/nj3srpuzyahyvukzicfr0b5wnja.png\"><\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"ustroystvo-psevdoterminala\">\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0441\u0435 \u0431\u043b\u0438\u0436\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u043c\u0441\u044f \u043a \u0437\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0437\u0430\u0433\u043b\u044f\u043d\u0435\u043c &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442&#187; Linux \u2014 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u044f\u0434\u0440\u0430. \u0411\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435\u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0438 \u0438\u0434\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0432\u0432\u0435\u0434\u0435\u043c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e &#171;\u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432&#187;. \u041f\u043e \u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u044f\u0434\u0440\u0443, \u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043d\u0435\u0435 \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 Linux \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0422\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0438 \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u0415\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static int __init pty_init(void) {     legacy_pty_init();     unix98_pty_init(); \/\/ &lt;- \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442     return 0; } device_initcall(pty_init); \/\/ \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u043a\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>unix98_pty_init()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static void __init unix98_pty_init(void) {     ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,             TTY_DRIVER_RESET_TERMIOS |             TTY_DRIVER_REAL_RAW |             TTY_DRIVER_DYNAMIC_DEV |             TTY_DRIVER_DEVPTS_MEM |             TTY_DRIVER_DYNAMIC_ALLOC);     if (IS_ERR(ptm_driver))         panic(\"Couldn't allocate Unix98 ptm driver\");     pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,             TTY_DRIVER_RESET_TERMIOS |             TTY_DRIVER_REAL_RAW |             TTY_DRIVER_DYNAMIC_DEV |             TTY_DRIVER_DEVPTS_MEM |             TTY_DRIVER_DYNAMIC_ALLOC);     if (IS_ERR(pts_driver))         panic(\"Couldn't allocate Unix98 pts driver\");      ptm_driver-&gt;driver_name = \"pty_master\";     ptm_driver-&gt;name = \"ptm\";     ptm_driver-&gt;major = UNIX98_PTY_MASTER_MAJOR;     ptm_driver-&gt;minor_start = 0;     ptm_driver-&gt;type = TTY_DRIVER_TYPE_PTY;     ptm_driver-&gt;subtype = PTY_TYPE_MASTER;     ptm_driver-&gt;init_termios = tty_std_termios;     ptm_driver-&gt;init_termios.c_iflag = 0;     ptm_driver-&gt;init_termios.c_oflag = 0;     ptm_driver-&gt;init_termios.c_cflag = B38400 | CS8 | CREAD;     ptm_driver-&gt;init_termios.c_lflag = 0;     ptm_driver-&gt;init_termios.c_ispeed = 38400;     ptm_driver-&gt;init_termios.c_ospeed = 38400;     ptm_driver-&gt;other = pts_driver;     tty_set_operations(ptm_driver, &amp;ptm_unix98_ops);      pts_driver-&gt;driver_name = \"pty_slave\";     pts_driver-&gt;name = \"pts\";     pts_driver-&gt;major = UNIX98_PTY_SLAVE_MAJOR;     pts_driver-&gt;minor_start = 0;     pts_driver-&gt;type = TTY_DRIVER_TYPE_PTY;     pts_driver-&gt;subtype = PTY_TYPE_SLAVE;     pts_driver-&gt;init_termios = tty_std_termios;     pts_driver-&gt;init_termios.c_cflag = B38400 | CS8 | CREAD;     pts_driver-&gt;init_termios.c_ispeed = 38400;     pts_driver-&gt;init_termios.c_ospeed = 38400;     pts_driver-&gt;other = ptm_driver;     tty_set_operations(pts_driver, &amp;pty_unix98_ops);      if (tty_register_driver(ptm_driver))         panic(\"Couldn't register Unix98 ptm driver\");     if (tty_register_driver(pts_driver))         panic(\"Couldn't register Unix98 pts driver\");      \/* Now create the \/dev\/ptmx special device *\/     tty_default_fops(&amp;ptmx_fops);     ptmx_fops.open = ptmx_open;      cdev_init(&amp;ptmx_cdev, &amp;ptmx_fops);     if (cdev_add(&amp;ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||         register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, \"\/dev\/ptmx\") &lt; 0)         panic(\"Couldn't register \/dev\/ptmx driver\");     device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, \"ptmx\");<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 3 \u0432\u0435\u0449\u0438: <\/p>\n<p>  <\/p>\n<ol>\n<li>\u0412\u044b\u0437\u043e\u0432\u044b <code>tty_set_operatons<\/code> \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 pty master \u0438 pty slave \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/li>\n<li>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>ptmx_open<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 <em>\/dev\/ptmx<\/em>. \u0412\u0430\u0436\u043d\u043e: \/dev\/ptmx \u2014 \u044d\u0442\u043e \u043d\u0435 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0430 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/li>\n<li>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 PTM \u0438 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443:<\/p>\n<p>  <\/p>\n<h4 id=\"1-tty_set_operations\">1. tty_set_operations<\/h4>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <strong>tty_set_operations()<\/strong> \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">void tty_set_operations(struct tty_driver *driver,             const struct tty_operations *op) {     driver-&gt;ops = op; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <strong>tty_operations<\/strong> \u2014 \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0434\u0435\u043b\u044e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 <code>pty_unix98_ops<\/code> \u0438 <code>ptm_unix98_ops<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static const struct tty_operations ptm_unix98_ops = {     .install = pty_unix98_install,     .remove = pty_unix98_remove,     .open = pty_open,     .close = pty_close,     .write = pty_write,     \/\/ ... };  static const struct tty_operations pty_unix98_ops = {     .install = pty_unix98_install,     .remove = pty_unix98_remove,     .open = pty_open,     .close = pty_close,     .write = pty_write,     \/\/ ... };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0443\u044e \u043f\u043e \u0441\u0442\u0430\u0442\u044c\u0435 \u043e \u0421\u0438\u0448\u043d\u043e\u043c printf \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>pty_write<\/code> \u2014 \u043a \u043d\u0435\u0439 \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/o8\/e-\/kc\/o8e-kcpqestn7f481gcx38qmzuo.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u043e\u0438\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u041a\u0441\u0442\u0430\u0442\u0438, \u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f read() \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u2014 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e \u043d\u0430 <code>pty_read()<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0443\u0437\u043d\u0430\u0451\u043c \u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 \u2014 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 TTY \u0443\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h4 id=\"2-ptmx_open\">2. ptmx_open<\/h4>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a <strong>ptmx_open()<\/strong>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static int ptmx_open(struct inode *inode, struct file *filp) {     struct tty_struct *tty; \/\/ \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 - \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430!     fsi = devpts_acquire(filp); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 devpts      index = devpts_new_index(fsi); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \/dev\/pts     \/\/ ...     tty = tty_init_dev(ptm_driver, index);     \/\/ ...     devpts_pty_new(fsi, index, tty-&gt;link); \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 \/dev\/pts      retval = ptm_driver-&gt;ops-&gt;open(tty, filp); \/\/ \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>tty_init_dev()<\/code>, \u0433\u0434\u0435 \u043f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u043c \u0437\u043e\u043d\u0443 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 PTY \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0430\u0439\u043b\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u043e\u0431\u0449\u0438\u0435 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx) {     struct tty_struct *tty;     tty = alloc_tty_struct(driver, idx);      retval = tty_driver_install_tty(driver, tty);      \/*      * Structures all installed ... call the ldisc open routines.      *\/     retval = tty_ldisc_setup(tty, tty-&gt;link); \/\/ \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u043e\u0431\u043e\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432      return tty; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>alloc_tty_struct()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx) {     struct tty_struct *tty;      tty = kzalloc(sizeof(*tty), GFP_KERNEL); \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c tty_struct      tty_ldisc_init(tty) \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 tty_struct      tty-&gt;driver = driver; \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 tty_struct     tty-&gt;ops = driver-&gt;ops;  \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 tty_struct. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430     tty-&gt;index = idx; \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 tty \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430      return tty; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043d\u0430\u0441 \u0437\u0434\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442, \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>tty_ldisc_init()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">int tty_ldisc_init(struct tty_struct *tty) {     struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);     if (IS_ERR(ld))         return PTR_ERR(ld);     tty-&gt;ldisc = ld; \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 tty_struct     return 0; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>tty_ldisc_get()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc) {     struct tty_ldisc *ld; \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438     struct tty_ldisc_ops *ldops; \/\/ \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438      ldops = get_ldops(disc); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u041d\u0430\u0448 \u0442\u0438\u043f - N_TTY      ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL | __GFP_NOFAIL);     ld-&gt;ops = ldops; \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b     ld-&gt;tty = tty; \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 tty_struct \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0435. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b      return ld; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>alloc_tty_struct()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <em>tty_struct<\/em> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <em>tty_ldisc<\/em>. \u041e\u0431\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u043f\u043e\u0431\u043b\u0438\u0436\u0435.<\/p>\n<p>  <\/p>\n<ul>\n<li><strong>tty_struct<\/strong> \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043b\u044f\u043c. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"objectivec\">struct tty_struct {     struct tty_driver *driver; \/\/ \u0434\u0440\u0430\u0439\u0432\u0435\u0440 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430     const struct tty_operations *ops; \/\/ \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u042d\u0442\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 driver-&gt;ops, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430     int index; \/\/ \u0438\u043d\u0434\u0435\u043a\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430     struct tty_ldisc *ldisc; \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438     struct tty_struct *link; \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0447\u0430\u0441\u0442\u044c PTY     \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><strong>tty_ldisc<\/strong> \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0421\u043e\u0441\u0442\u043e\u0438\u0442 \u043e\u043d\u0430 \u0432\u0441\u0435\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"objectivec\">struct tty_ldisc {     struct tty_ldisc_ops *ops; \/\/ \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b     struct tty_struct *tty; \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 tty_struct \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0441\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0441\u0432\u044f\u0436\u0435\u043c \u0438\u0445 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0432 \u043a\u043e\u0434\u0435:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1d\/bt\/n4\/1dbtn4m_6c6i4n7oaohoguci2m0.jpeg\" alt=\"\u0421\u0442\u0440\u043e\u0435\u043d\u0438\u0435 tty_struct\" title=\"\u0421\u0442\u0440\u043e\u0435\u043d\u0438\u0435 tty_struct\"><\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 tty_struct \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0434\u043b\u044f PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0410 \u0447\u0442\u043e \u0436\u0435 \u043e PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>tty_init_dev()<\/code> \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>tty_driver_install_tty()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">\/**  * This method is responsible  * for ensuring any need additional structures are allocated and configured.  *\/ static int tty_driver_install_tty(struct tty_driver *driver,                         struct tty_struct *tty) {     return driver-&gt;ops-&gt;install ? driver-&gt;ops-&gt;install(driver, tty) :         tty_standard_install(driver, tty); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0435\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u041f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0431\u043e \u044d\u0442\u043e, \u0447\u0435\u0440\u0442 \u0432\u043e\u0437\u044c\u043c\u0438, \u0446\u0435\u043b\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430! \u041d\u043e \u043c\u044b \u0442\u043e \u0441 \u0432\u0430\u043c\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0437\u0434\u0435\u0441\u044c <em>driver-&gt;ops-&gt;install<\/em>? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f PTM \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0435\u0449\u0451 \u0440\u0430\u0437:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static const struct tty_operations ptm_unix98_ops = {     .install = pty_unix98_install,     \/\/ ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043f\u043e\u0439\u043c\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>pty_unix98_install()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) {     return pty_common_install(driver, tty, false); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>pty_common_install()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,         bool legacy) {     struct tty_struct *o_tty; \/\/ tty_struct \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 PTY - \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430      \/\/ \u0430 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f install. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u044b \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 tty_struct, \u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430     if (driver-&gt;subtype != PTY_TYPE_MASTER)          return -EIO;      o_tty = alloc_tty_struct(driver-&gt;other, idx);      tty-&gt;link   = o_tty;     o_tty-&gt;link = tty; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <em>tty_struct<\/em> \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041e\u0431\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0445\u0440\u0430\u043d\u044f\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c tty_struct \u0434\u043b\u044f PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u0440\u0437\u0438\u043d\u0443.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h4 id=\"registraciya-drayvera\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/h4>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0432\u0435\u0434\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0430\u0439\u043b\u043e\u043c?).<br \/>  \u042d\u0442\u043e \u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u043a\u0430\u043a PTM, \u0442\u0430\u043a \u0438 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static const struct file_operations tty_fops = {     .llseek     = no_llseek,     .read       = tty_read,     .write      = tty_write,     .poll       = tty_poll,     .unlocked_ioctl = tty_ioctl,     .compat_ioctl   = tty_compat_ioctl,     .open       = tty_open,     .release    = tty_release,     .fasync     = tty_fasync,     .show_fdinfo    = tty_show_fdinfo, };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u043d\u0430\u0448\u0443 \u043a\u043e\u0440\u0437\u0438\u043d\u0443, \u0438\u0431\u043e \u043e\u043d\u0430 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0442\u043e \u0438 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0438 \u0441\u043b\u0443\u0436\u0438\u0442 \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043e\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440\u0430 <em>\/dev\/ptmx<\/em>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0442\u043e\u0440\u043e\u0435 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u0438 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043e\u0431\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5w\/aw\/rg\/5wawrgbqqw1_llmi1r8g2kbwrzc.jpeg\" title=\"\u0421\u0442\u0440\u043e\u0435\u043d\u0438\u0435 PTY\"><\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"hello-world\">Hello, World!<\/h2>\n<p>  <\/p>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u043c\u044b \u0438 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u0435 \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0443\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 &#171;Hello, World!&#187;, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0421\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">#include &lt;stdio.h&gt;  void main() {     printf(\"Hello, World!\\n\"); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 &#171;Hello, World!&#187; \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0432\u043e\u0434\u0430. \u0415\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b, \u043a\u0443\u0434\u0430 \u044d\u0442\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0439\u0434\u0435\u0442. \u041d\u0430\u043f\u0440\u0430\u0432\u044c\u0442\u0435 stdout \u0432 <em>\/dev\/null<\/em> \u2014 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0433\u0434\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f. \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 \u0421\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0430 \u043d\u0430\u0447\u043d\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0441 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Linux.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 Unix \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 <em>write()<\/em>, <em>read()<\/em>, <em>close()<\/em> \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438, \u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 write() \u043d\u0430 \/dev\/pts\/0 \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0432 \u043e\u0431\u0449\u0443\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>__vfs_write()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">ssize_t __vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) {     ssize_t ret;      \/\/...     ret = file-&gt;f_op-&gt;write(file, buf, count, pos);     \/\/...    return ret; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e write() \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u044b\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043e\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static const struct file_operations tty_fops = {     \/\/ ...     .write = tty_write,     \/\/ ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>tty_write()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static ssize_t tty_write(struct file *file, const char __user *buf,                         size_t count, loff_t *ppos) {     struct tty_struct *tty = file_tty(file);     struct tty_ldisc *ld;     ssize_t ret;      ld = tty_ldisc_ref_wait(tty);     ret = do_tty_write(ld-&gt;ops-&gt;write, tty, file, buf, count);     tty_ldisc_deref(ld);     return ret; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <em>tty_struct<\/em> \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0435\u0442 \u0438\u0437 \u043d\u0435\u0435 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e write() \u0434\u043b\u044f \u043d\u0435\u0435. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static struct tty_ldisc_ops n_tty_ops = {     .write           = n_tty_write,     \/\/ ... };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>n_tty_write()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">\/**  *  n_tty_write     -   write function for tty  *  @tty: tty device  *  @file: file object  *  @buf: userspace buffer pointer  *  @nr: size of I\/O  *\/ static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,                const unsigned char *buf, size_t nr) {     const unsigned char *b = buf; \/\/ b - \u0431\u0443\u0444\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \"Hello, World!\". \u042d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u0443\u0444\u0435\u0440 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435     int c; \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432      \/\/ \u043f\u0438\u0448\u0435\u043c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043f\u043e\u043a\u0430 write() \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0432\u0435\u0440\u043d\u0435\u0442 0, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e     while (nr &gt; 0) {         c = tty-&gt;ops-&gt;write(tty, b, nr); \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c write() \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430         if (!c)             break;         b += c; \/\/ \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435         nr -= c; \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 - \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441\u0442\u0440\u043e\u043a\u0430 &#171;Hello, World!&#187; \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0432 write() \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041d\u0430\u0439\u0434\u0435\u043c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static const struct tty_operations pty_unix98_ops = {     .write = pty_write,         \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>pty_write()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) {   struct tty_struct *to = tty-&gt;link; \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 PTY. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 - \u044d\u0442\u043e PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e    if (c &gt; 0) {     \/\/ \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e     c = tty_insert_flip_string(to-&gt;port, buf, c);     \/\/ \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f     if (c) {        tty_flip_buffer_push(to-&gt;port);       tty_wakeup(tty);     }   }   return c; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0434\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u043c \u043d\u0430\u0448 \u043f\u0443\u0442\u044c \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">        __vfs_write() -&gt; \/\/ 1-\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430                 tty_write() -&gt;                         do_tty_write() -&gt;                                 n_tty_write() -&gt; \/\/ 2-\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438                                         pty_write() \/\/ 3-\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043f\u0443\u0441\u0442\u0438\u043b\u0438. \u0418\u0442\u0430\u043a, \u0431\u0443\u0444\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u0441 \u0441 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <em>flip buffer<\/em>. <strong>Flip buffer<\/strong> \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 tty driver \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435. \u041a\u043e\u0433\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430 \u0438 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0415\u0441\u043b\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0443\u0436\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0435. \u041a\u043e\u0433\u0434\u0430 \u0438 \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0430\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430, \u0430 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0443\u0442 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0430 flip buffer \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 (\u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0437\u0434\u0435\u0441\u044c \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u043d\u043e \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043b\u043e\u0432\u0430 flip).<\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u043b\u0433\u043e \u0442\u044f\u043d\u0443\u0442\u044c \u0438 \u0441\u043d\u043e\u0432\u0430 \u0438\u0434\u0442\u0438 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412\u044b\u0437\u043e\u0432 <code>tty_insert_flip_string()<\/code> \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0435\u0440\u0435\u0442\u0435\u043a\u0430\u0435\u0442 \u0432 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>tty_insert_flip_string_fixed_flag()<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">int tty_insert_flip_string_fixed_flag(struct tty_port *port,         const unsigned char *chars, char flag, size_t size) {     int copied = 0;     do {         int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE); \/\/ \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c         int space = __tty_buffer_request_room(port, goal, flags); \/\/ \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435         struct tty_buffer *tb = port-&gt;buf.tail; \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432         if (unlikely(space == 0))             break;         memcpy(char_buf_ptr(tb, tb-&gt;used), chars, space); \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432         tb-&gt;used += space;         copied += space;         chars += space;         \/* There is a small chance that we need to split the data over            several buffers. If this is the case we must loop *\/     } while (unlikely(size &gt; copied));     return copied; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, flip buffer \u0431\u044b\u043b \u0437\u0430\u043c\u0451\u043d\u0435\u043d \u043d\u043e\u0432\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044f\u0434\u0440\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u0430 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b \u0441 \u0440\u0430\u043d\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u043c\u0438. \u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u044f\u0441\u043d\u043e \u043e\u0434\u043d\u043e \u2014 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u044b \u0432 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430 \u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 &#171;Hello, World!&#187; \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0432 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f GNOME Terminal Server \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u0435 <em>poll()<\/em> (\u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f I\/O) \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 master \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0412\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u043f\u0440\u043e\u0441\u043d\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435? \u041a\u0430\u043a \u0431\u044b \u043d\u0435 \u0442\u0430\u043a. \u041a\u043e\u0433\u0434\u0430 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e\u0431 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0435 \u043b\u0438\u043d\u0438\u0438, \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0432\u043e\u0434 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430 \u043e \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>tty_flip_buffer_push()<\/code> (\u0432 \u0442\u043e\u043c \u0436\u0435 pty_write):<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">\/**  *  tty_flip_buffer_push    -   terminal  *  @port: tty port to push  *  *  Queue a push of the terminal flip buffers to the line discipline.  *  Can be called from IRQ\/atomic context.  *  *  In the event of the queue being busy for flipping the work will be  *  held off and retried later.  *\/  void tty_flip_buffer_push(struct tty_port *port) {     tty_schedule_flip(port); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>tty_schedule_flip()<\/code>, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">\/**  *  tty_schedule_flip   -   push characters to ldisc  *  @port: tty port to push from  *  *  Takes any pending buffers and transfers their ownership to the  *  ldisc side of the queue. It then schedules those characters for  *  processing by the line discipline.  *\/  void tty_schedule_flip(struct tty_port *port) {     struct tty_bufhead *buf = &amp;port-&gt;buf;      \/* paired w\/ acquire in flush_to_ldisc(); ensures      * flush_to_ldisc() sees buffer data.      *\/     smp_store_release(&amp;buf-&gt;tail-&gt;commit, buf-&gt;tail-&gt;used);     queue_work(system_unbound_wq, &amp;buf-&gt;work); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042f \u043d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 <em>work<\/em> (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447) \u0438 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u044f\u0434\u0440\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u043a\u0443, \u043d\u043e \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u044f\u0441\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u2014 \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>flush_to_ldisc()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static void flush_to_ldisc(struct work_struct *work) {     struct tty_port *port = container_of(work, struct tty_port, buf.work); \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 tty_port PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. tty_port - \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0443\u0444\u0435\u0440\u0443 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430     struct tty_bufhead *buf = &amp;port-&gt;buf;     struct tty_buffer *head = buf-&gt;head;     \/\/ ...     receive_buf(port, head);     \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>receive_buf()<\/code> \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0435\u0440\u0435\u0442\u0435\u043a\u0430\u0435\u0442 \u0432 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>__receive_buf()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0438\u0441\u043f\u0430\u0442\u0447\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0443 \u0432\u0432\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,               char *fp, int count) {     struct n_tty_data *ldata = tty-&gt;disc_data;     bool preops = I_ISTRIP(tty) || (I_IUCLC(tty) &amp;&amp; L_IEXTEN(tty));      if (ldata-&gt;real_raw)         n_tty_receive_buf_real_raw(tty, cp, fp, count);     else if (ldata-&gt;raw || (L_EXTPROC(tty) &amp;&amp; !preops))         n_tty_receive_buf_raw(tty, cp, fp, count);     else if (tty-&gt;closing &amp;&amp; !L_EXTPROC(tty))         n_tty_receive_buf_closing(tty, cp, fp, count);     else {         if (ldata-&gt;lnext) {             char flag = TTY_NORMAL;              if (fp)                 flag = *fp++;             n_tty_receive_char_lnext(tty, *cp++, flag);             count--;         }          if (!preops &amp;&amp; !I_PARMRK(tty))             n_tty_receive_buf_fast(tty, cp, fp, count);         else             n_tty_receive_buf_standard(tty, cp, fp, count);     }      if (read_cnt(ldata)) {         kill_fasync(&amp;tty-&gt;fasync, SIGIO, POLL_IN);         wake_up_interruptible_poll(&amp;tty-&gt;read_wait, EPOLLIN);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 <em>n_tty_receive_buf<\/em> (\u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u0445, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0441\u0443\u0444\u0444\u0438\u043a\u0441 _raw) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <strong>read_buf<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0434\u043b\u044f PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0432 raw \u0440\u0435\u0436\u0438\u043c, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 read_buf. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 PTM \u043a PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d.<\/p>\n<p>  <\/p>\n<p>\u041e\u043f\u0438\u0448\u0443 \u043f\u043e\u043b\u043d\u0443\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0434\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"objectivec\">    ...         pty_write() -&gt; \/\/ 3-\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0434\u0440\u0430\u0439\u0432\u0435\u0440 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430                 tty_insert_flip_string + tty_flip_buffer_push() -&gt;                         tty_schedule_flip() -&gt;             --- \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430                 flush_to_ldisc() -&gt; \/\/ 2-\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c: \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430                         receive_buf() -&gt;                                 n_tty_receive_buf -&gt;                                         n_tty_receive_buf_common -&gt;                                                 __receive_buf()<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u043d\u0438\u043a\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f PTM \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u2014 \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0432 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0435 \u043b\u0438\u043d\u0438\u0438 \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 PTS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0434\u043e\u0445\u043d\u0443\u0442\u044c: \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0422\u0435\u043f\u0435\u0440\u044c GNOME Terminal Server \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 &#171;Hello, World!&#187;, \u0432\u044b\u0437\u044b\u0432\u0430\u044f read() \u043d\u0430 PTM \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u0412\u044b\u0437\u043e\u0432 read() \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 write() \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u2014 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>n_tty_read()<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u044f\u0434\u0440\u0435 \u2014 <em>read_buf<\/em> \u2014 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0431\u0443\u0444\u0435\u0440. \u0414\u0430\u043b\u0435\u0435 GNOME Terminal Server \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 X Server, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 \u0435\u0451 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 &#171;Hello, World!&#187; \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0443\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 -&gt;          PTY slave -&gt;                  PTM master -&gt;                          GNOME-TERMINAl-SERVER -&gt;                                  X Server -&gt;                                         -&gt; \u0414\u0438\u0441\u043f\u043b\u0435\u0439<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432<\/li>\n<li>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/li>\n<li>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 TTY \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/li>\n<li>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u0441\u0435\u0432\u0434\u043e\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044b<\/li>\n<li>\u041a\u0430\u043a\u043e\u0439 \u043f\u0443\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0421\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0434\u043e \u0434\u0438\u0441\u043f\u043b\u0435\u044f<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u2014 \u0441\u043c\u0435\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c!<\/p>\n<p>  <\/p>\n<h3 id=\"istochniki\">\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h3>\n<p>  <\/p>\n<ul>\n<li>Linux man pages<\/li>\n<li><a href=\"https:\/\/unix.stackexchange.com\/q\/96694\/346664\">https:\/\/unix.stackexchange.com\/q\/96694\/346664<\/a><\/li>\n<li><a href=\"https:\/\/unix.stackexchange.com\/q\/93531\/346664\">https:\/\/unix.stackexchange.com\/q\/93531\/346664<\/a><\/li>\n<li><a href=\"https:\/\/unix.stackexchange.com\/q\/117981\/346664\">https:\/\/unix.stackexchange.com\/q\/117981\/346664<\/a><\/li>\n<li><a href=\"https:\/\/askubuntu.com\/q\/506510\">https:\/\/askubuntu.com\/q\/506510<\/a><\/li>\n<li><a href=\"http:\/\/www.linusakesson.net\/programming\/tty\/\">www.linusakesson.net\/programming\/tty\/<\/a><\/li>\n<li><a href=\"https:\/\/spin0r.wordpress.com\/2012\/12\/28\/terminally-confused-part-seven\/\">https:\/\/spin0r.wordpress.com\/2012\/12\/28\/terminally-confused-part-seven\/<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/neobit\/blog\/330764\/\">https:\/\/habr.com\/ru\/company\/neobit\/blog\/330764\/<\/a><\/li>\n<li>\u041a\u043d\u0438\u0433\u0430 Advanced Programming in the UNIX Environment, 3rd Edition<\/li>\n<\/ul>\n<p><cut><\/cut><\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/460257\/\"> https:\/\/habr.com\/ru\/post\/460257\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p><a href=\"https:\/\/habr.com\/ru\/post\/460257\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ha\/5f\/0v\/ha5f0vjiijc9c92bnnt56z7jcpg.jpeg\"><\/a><\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u0435\u043d\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/438044\">\u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0431 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0421\u0438\u0448\u043d\u043e\u0433\u043e printf<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0430\u043c \u0431\u044b\u043b \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u043e\u0439 \u043f\u0443\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043d\u0435\u0434\u043e\u0447\u0435\u0442 \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u0447\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f Terminal \u043e\u0442 Shell, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Pseudoterminal, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-292160","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/292160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=292160"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/292160\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=292160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=292160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=292160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}