پایانه مجازی os.pty
اجرای یک برنامه روی پایانهی مجازی: انتظار برای اعلانش، تایپ کردن کلیدها و تغییر اندازهی پنجره.
واردسازی سیستم عامل.پایانه مجازی
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
بعضی برنامهها وقتی روی پایانه نیستند رفتار دیگری دارند: پوسته اعلان نشان نمیدهد، یک REPL پژواک و ویرایش خط ندارد، و stty اندازهای برای گزارش ندارد. بستهی پایانه مجازی برنامه را به یک پایانهی مجازی وصل میکند، یعنی جفت دستگاهی که برای برنامه مثل پایانهی واقعی است، و سر دیگرش را به شما میدهد. آنچه مینویسید کلید فشردهشده است؛ آنچه میخوانید همان است که آدم روی صفحه میبیند، با نویسههایی که پایانه پژواک میدهد.
باز کردن همان فرمان بستهی فرآیند را میگیرد (برنامه، آرگومانها، پوشه و محیط؛ حالت جریانها اثری ندارد چون هر سه جریان همان پایانهاند) و همان فرزند را برمیگرداند. پس نوشتن، خواندن برای متن، خواندن به مدت، خواندن موجود، انتظار، کشتن و بستن همانطور کار میکنند که آنجا آمده. دو چیز فرق دارد: خروجی و خطا در یک جریان مخلوط میرسند و بستن ورودی کلید Ctrl-D یعنی پایان ورودی را میفرستد، چون بستن پایانه برنامه را قطع میکند.
اشتباههای رایج:
- فرستادن
\nبه جای Enter. پایانه با فشردن Enter نویسهی\rمیفرستد و لایهی خط آن را برای برنامههایی که خط میخوانند به خطتازه تبدیل میکند؛ پس\rبنویسید. برنامهای در حالت خام خود\rرا میبیند. - انتظار
\nدر خروجی. پایانه هر خطتازه را به\r\nتبدیل میکند؛ هنگام انتظار برای پایان خط دنبال\r\nبگردید. - خواندن بدون مهلت.
خواندن برای متنرا با اعلان و چند میلیثانیه به کار ببرید ومهلت تمام شدرا بررسی کنید تا برنامهای که اعلان را هرگز چاپ نمیکند برنامهی شما را قفل نکند. - فراموش کردن پژواک تایپ خودتان. پس از
نوشتننخستین چیزی که برمیگردد پژواک همان است که تایپ کردید. - تنظیم نکردن
TERM. برنامههایی که روی صفحه میکشند آن را میخوانند؛ باEnv("TERM", "xterm")در فرمان بگذارید.
این بسته در لینوکس، مک و BSDها کار میکند. در ویندوز پشتیبانی می شود نادرست برمیگرداند و باز کردن فرزندی با راه افتاد نادرست برمیگرداند.
باز کردن پایانه و تایپ در آن
برنامه را با باز کردن و اندازهی پنجره به سطر و ستون شروع کنید (۰ یعنی ۲۴ در ۸۰). نوشتن متن یک کلید، با \r برای Enter، بهعنوان ورودی به برنامه میرسد؛ خواندن نخست پژواک پایانه و سپس پاسخ برنامه را برمیگرداند. صدا زدن بستن ورودی ورودی برنامهای مثل cat را تمام میکند.
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی
تابع ریشه:
ناپایا cmd := فرآیند.فرمان تازه("cat")
ناپایا term := پایانه مجازی.باز کردن(cmd، 24، 80)
term.نوشتن("typed on a terminal\r")
echoed := term.خواندن برای متن("terminal\r\n"، 2000)
سرچاپ "پایانه آن را بازتاباند:"، وارونه echoed.مهلت تمام شد
echoed.آزادسازی()
answer := term.خواندن برای متن("terminal\r\n"، 2000)
سرچاپ "cat پاسخ داد:"، وارونه answer.مهلت تمام شد
answer.آزادسازی()
term.بستن ورودی()
سرچاپ "خروج:"، term.انتظار(2000).کد
term.بستن()
cmd.آزادسازی()
پایانانتظار برای اعلان
برنامهی تعاملی یک اعلان چاپ میکند و منتظر میماند. خواندن برای متن همین که متن اعلان برسد برمیگردد، یا پس از مهلتی که دادید مهلت تمام شد را گزارش میکند. حلقهی هر آزمون پایانه همین است: انتظار برای اعلان، تایپ یک خط، انتظار برای پاسخ.
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی
تابع ریشه:
ناپایا cmd := فرآیند.فرمان تازه("sh")
cmd.افزودن آرگومان("-c")
cmd.افزودن آرگومان("printf 'name? '; read name; echo \"hi $name\"")
ناپایا term := پایانه مجازی.باز کردن(cmd، 24، 80)
ask := term.خواندن برای متن("name? "، 2000)
سرچاپ "پرسش دیده شد:"، وارونه ask.مهلت تمام شد
ask.آزادسازی()
term.نوشتن("Sara\r")
reply := term.خواندن برای متن("hi Sara"، 2000)
سرچاپ "پاسخ دیده شد:"، وارونه reply.مهلت تمام شد
reply.آزادسازی()
سرچاپ "خروج:"، term.انتظار(2000).کد
term.بستن()
cmd.آزادسازی()
پایانتغییر اندازهی پنجره
تغییر اندازه اندازهی پایانه را تعیین میکند و سیستم به برنامه خبر میدهد، همانطور که برنامهی تمامصفحه میفهمد دوباره بکشد. گرفتن اندازه اندازه را برمیخواند. برنامه اندازهی تازه را بار بعد که بپرسد میبیند، مثلاً با stty size.
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی
تابع ریشه:
ناپایا cmd := فرآیند.فرمان تازه("sh")
cmd.افزودن آرگومان("-c")
cmd.افزودن آرگومان("stty size; read x; stty size")
ناپایا term := پایانه مجازی.باز کردن(cmd، 24، 80)
first := term.خواندن برای متن("24 80"، 2000)
سرچاپ "اندازهی نخست دیده شد:"، وارونه first.مهلت تمام شد
first.آزادسازی()
سرچاپ "تغییر اندازه:"، پایانه مجازی.تغییر اندازه(term، 50، 132)
term.نوشتن("\r")
second := term.خواندن برای متن("50 132"، 2000)
سرچاپ "اندازهی دوم دیده شد:"، وارونه second.مهلت تمام شد
second.آزادسازی()
سرچاپ "خروج:"، term.انتظار(2000).کد
term.بستن()
cmd.آزادسازی()
پایان| نیاز | چه به کار ببرید |
|---|---|
| اجرای برنامه روی پایانه | باز کردن |
| تایپ کلیدها | فرزند.نوشتن، با \r برای Enter |
| انتظار برای اعلان | فرزند.خواندن برای متن با مهلت |
| دیدن همهی آنچه در یک بازه چاپ میشود | فرزند.خواندن به مدت |
| فرستادن کلید پایان ورودی | فرزند.بستن ورودی |
| تغییر یا خواندن اندازهی پنجره | تغییر اندازه، گرفتن اندازه |
| دانستن اینکه پایانه در دسترس است | پشتیبانی می شود |
| لوله به جای پایانه | فرآیند |
گونهها
اندازه پنجره Size
ساختار اندازه پنجره| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| سطرها | rows | صحیح = 0 | شمار سطرها. |
| ستون ها | cols | صحیح = 0 | شمار ستونها. |
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی
تابع ریشه:
ناپایا cmd := فرآیند.فرمان تازه("sh")
cmd.افزودن آرگومان("-c")
cmd.افزودن آرگومان("read line; stty size")
ناپایا term := پایانه مجازی.باز کردن(cmd، 24، 80)
سرچاپ "آغاز:"، پایانه مجازی.گرفتن اندازه(term).سطرها، پایانه مجازی.گرفتن اندازه(term).ستون ها
سرچاپ "تغییر اندازه:"، پایانه مجازی.تغییر اندازه(term، 40، 120)
سرچاپ "اکنون:"، پایانه مجازی.گرفتن اندازه(term).سطرها، پایانه مجازی.گرفتن اندازه(term).ستون ها
term.نوشتن("go\r")
out := term.خواندن برای متن("40 120"، 2000)
سرچاپ "فرزند اندازه تازه را میبیند:"، وارونه out.مهلت تمام شد
out.آزادسازی()
سرچاپ "خروج:"، term.انتظار(2000).کد
term.بستن()
cmd.آزادسازی()
پایانتابعها
تغییر اندازه Resize
تابع تغییر اندازه(c: فرآیند.فرزند، rows: صحیح، cols: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: os-pty-Resize.salam
گرفتن اندازه GetSize
تابع گرفتن اندازه(c: فرآیند.فرزند): اندازه پنجرهنمونهی این مورد همراه با موارد بالاتر آمده است: os-pty-Resize.salam
پشتیبانی می شود Supported
تابع پشتیبانی می شود(): منطقی// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی
تابع ریشه:
ناپایا cmd := فرآیند.فرمان تازه("sh")
cmd.افزودن آرگومان("-c")
cmd.افزودن آرگومان("stty size")
ناپایا term := پایانه مجازی.باز کردن(cmd، 30، 100)
out := term.خواندن به مدت(1000)
سرچاپ out.داده.پیراست()
out.آزادسازی()
سرچاپ "خروج:"، term.انتظار(2000).کد
term.بستن()
cmd.آزادسازی()
پایانباز کردن Open
تابع باز کردن(c: فرآیند.فرمان، rows: صحیح، cols: صحیح): فرآیند.فرزندفرزند برمیگرداند که خواندن و نوشتنش از پایانه میگذرد. فرزند نشست خودش را دارد و پایانه پایانهی کنترلیاش است. اگر برنامه پیدا یا شروع نشود، راه افتاد نادرست است و خطا دلیل را میگوید.نمونهی این مورد همراه با موارد بالاتر آمده است: os-pty-Open.salam