کتابخانه‌ی استاندارد · سیستم و ابزار

پایانه مجازی 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 را تمام می‌کند.

os-pty-guide-open.salam
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی

تابع ریشه:
    ناپایا 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.آزادسازی()
پایان
خروجیپایانه آن را بازتاباند: true cat پاسخ داد: true خروج: 0

انتظار برای اعلان

برنامه‌ی تعاملی یک اعلان چاپ می‌کند و منتظر می‌ماند. خواندن برای متن همین که متن اعلان برسد برمی‌گردد، یا پس از مهلتی که دادید مهلت تمام شد را گزارش می‌کند. حلقه‌ی هر آزمون پایانه همین است: انتظار برای اعلان، تایپ یک خط، انتظار برای پاسخ.

os-pty-guide-prompt.salam
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی

تابع ریشه:
    ناپایا 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.آزادسازی()
پایان
خروجیپرسش دیده شد: true پاسخ دیده شد: true خروج: 0

تغییر اندازه‌ی پنجره

تغییر اندازه اندازه‌ی پایانه را تعیین می‌کند و سیستم به برنامه خبر می‌دهد، همان‌طور که برنامه‌ی تمام‌صفحه می‌فهمد دوباره بکشد. گرفتن اندازه اندازه را برمی‌خواند. برنامه اندازه‌ی تازه را بار بعد که بپرسد می‌بیند، مثلاً با stty size.

os-pty-guide-resize.salam
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی

تابع ریشه:
    ناپایا 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.آزادسازی()
پایان
خروجیاندازه‌ی نخست دیده شد: true تغییر اندازه: true اندازه‌ی دوم دیده شد: true خروج: 0
نیازچه به کار ببرید
اجرای برنامه روی پایانهباز کردن
تایپ کلیدهافرزند.نوشتن، با \r برای Enter
انتظار برای اعلانفرزند.خواندن برای متن با مهلت
دیدن همه‌ی آنچه در یک بازه چاپ می‌شودفرزند.خواندن به مدت
فرستادن کلید پایان ورودیفرزند.بستن ورودی
تغییر یا خواندن اندازه‌ی پنجرهتغییر اندازه، گرفتن اندازه
دانستن این‌که پایانه در دسترس استپشتیبانی می شود
لوله به جای پایانهفرآیند

گونه‌ها

اندازه پنجره Size

ساختار اندازه پنجره
اندازه‌ی پنجره‌ی پایانه به خانه‌های نویسه.
نامانگلیسیگونهتوضیح
سطرهاrowsصحیح = 0شمار سطرها.
ستون هاcolsصحیح = 0شمار ستون‌ها.
os-pty-Resize.salam
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی

تابع ریشه:
    ناپایا 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.آزادسازی()
پایان
خروجیآغاز: 24 80 تغییر اندازه: true اکنون: 40 120 فرزند اندازه تازه را می‌بیند: true خروج: 0

تابع‌ها

تغییر اندازه Resize

تابع تغییر اندازه(c: فرآیند.فرزند، rows: صحیح، cols: صحیح): منطقی
اندازه‌ی پایانه را تعیین می‌کند؛ به برنامه از تغییر خبر داده می‌شود. اگر فرزند پایانه نداشته باشد نادرست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-pty-Resize.salam

گرفتن اندازه GetSize

تابع گرفتن اندازه(c: فرآیند.فرزند): اندازه پنجره
اندازه‌ی پایانه را می‌خواند؛ اگر خوانده نشود سطر و ستون صفر است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-pty-Resize.salam

پشتیبانی می شود Supported

تابع پشتیبانی می شود(): منطقی
در جاهایی که پایانه‌ی مجازی هست درست است: لینوکس، مک و BSDها. در ویندوز نادرست.
os-pty-Open.salam
// زبان: فارسی
واردسازی سیستم عامل.فرآیند
واردسازی سیستم عامل.پایانه مجازی

تابع ریشه:
    ناپایا cmd := فرآیند.فرمان تازه("sh")
    cmd.افزودن آرگومان("-c")
    cmd.افزودن آرگومان("stty size")
    ناپایا term := پایانه مجازی.باز کردن(cmd، 30، 100)
    out := term.خواندن به مدت(1000)
    سرچاپ out.داده.پیراست()
    out.آزادسازی()
    سرچاپ "خروج:"، term.انتظار(2000).کد
    term.بستن()
    cmd.آزادسازی()
پایان
خروجی30 100 خروج: 0

باز کردن Open

تابع باز کردن(c: فرآیند.فرمان، rows: صحیح، cols: صحیح): فرآیند.فرزند
فرمان را روی یک پایانه‌ی مجازی تازه با سطر و ستون داده‌شده شروع می‌کند (۰ یعنی ۲۴ در ۸۰) و یک فرزند برمی‌گرداند که خواندن و نوشتنش از پایانه می‌گذرد. فرزند نشست خودش را دارد و پایانه پایانه‌ی کنترلی‌اش است. اگر برنامه پیدا یا شروع نشود، راه افتاد نادرست است و خطا دلیل را می‌گوید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-pty-Open.salam