ما در تلاش هستیم تا از یک سیستم HP9000، HP-UX 10.20 فیزیکی به یک کانتینر HP SRP تبدیل کنیم. ما متوجه شدهایم که وقتی به سیستم فیزیکی HP9000 شبکه راهاندازی میکنیم، بهعنوان یک دستگاه TTY وصل میشویم، اما وقتی کانتینر را وصل میکنیم، بهعنوان شبه ترمینال PTS وصل میشویم. برخی از برنامه هایی که در سیستم اجرا می کنیم اکنون شکایت دارند که این دستگاه TTY نیست (خطای 25 ENOTTY).
من یک برنامه آزمایشی C نوشتهام تا سعی کنم مشخص کنم کدام تماس باعث این مشکل شده است، و به نظر میرسد که دستور “BLOPEN” برای باز کردن توصیفگر فایل حالت بلوک است.
#include#include #include #include #include #include #include int main() { int fdm; int fds; char *slavename; int j_bfd; فایل *pf_stream; i_c_lflagsav کوتاه بدون امضا; کوتاه بدون امضا i_c_oflagsav; struct termio s_termio; if ((fdm = open(“/dev/ptmx”,O_RDWR)) == -1){ printf(“خطا در دریافت توصیفگر فایل %d
“، errno); بازگشت -1; } printf(“Opened /dev/ptmx
“); printf(“قبل از grantpt
“); grantpt(fdm)؛ printf(“after grantpt
“); printf(“قبل از باز کردن قفل
“); unlockpt(fdm)؛ printf(“after unlockpt
“); Slavename = ptsname(fdm); printf(“Slavename
“); printf(“%s
“,نام برده); if ((fds = open(slavename,O_RDWR)) == -1){ printf(“خطا در باز کردن Slavename
“); بازگشت -1; } ioctl(fds, I_PUSH, “ptem”); /* فشار ptem */ ioctl(fds, I_PUSH, “ldterm”); /* فشار ldterm */ /* بدون اکو. */ printf(“قبل از اکو
“); if (ioctl(fds,TCGETA,&s_termio) == -1) { printf(“بدون خطای اکو
“); بازگشت (-1); } i_c_lflagsav = s_termio.c_lflag; i_c_oflagsav = s_termio.c_oflag; printf(“قبل از هیچ تب
“); if ((s_termio.c_oflag & TAB3) != 0) { /* پرچم حالت خروجی را برای عدم تغییر برگه ها تنظیم کنید */ s_termio.c_oflag &= ~TAB3; /* مقدار جدید را تنظیم کنید */ if (ioctl(fds,TCSETA,&s_termio) == -1) { printf(“Error
“); /* سعی کنید درایور را به حالت قبل از تغییر تنظیم کنید */ s_termio.c_oflag = i_c_oflagsav; /* مقدار قدیمی را تنظیم کنید */ ioctl(fds,TCSETA,&s_termio); بازگشت (-1); } } /* یک توصیفگر فایل حالت بلوک را از blopen */ printf (“قبل از باز کردن حالت مسدود کردن
“); if ((j_bfd=blopen(fds,O_RDWR)) < 0 ) { printf("خطای %d در حین blopen "، errno); /* اگر مدیریت تب را تغییر دادیم، سعی کنید درایور را دوباره تنظیم کنید. */ printf("قبل از تنظیم مجدد "); if (((s_termio.c_oflag & TAB3) != 0)) ioctl(fds,TCSETA,&s_termio); printf("خطا در دریافت توصیفگر فایل حالت بلوک %d "، j_bfd); بازگشت (-1); } بازگشت 0; }
خروجی برنامه است
/dev/ptmx باز شد
قبل از اعطا
پس از اعطا
قبل از باز کردن قفل
بعد از باز کردن قفل
نام برده
/dev/pts/0 (من همیشه /dev/pts/0 را دریافت می کنم، حتی اگر این را از چندین ترمینال اجرا کنم؟ فکر می کردم در پایانه های بعدی /dev/pts/1، /dev/pts/2 را دریافت کنم؟)
قبل از عدم اکو
قبل از بدون برگه
قبل از باز شدن حالت بلوک
خطای 25 در هنگام blopen
قبل از تنظیم مجدد
خطا در دریافت توصیفگر فایل حالت بلوک -1
بنابراین سوال من این است که آیا کسی می داند چه چیزی باعث می شود BLOPEN خطای 25 ایجاد کند؟ چگونه تشخیص می دهد که دستگاه TTY است یا نه؟
منبع: https://community.hpe.com/t5/hp-ux-general/getting-error-25-enotty-when-calling-blopen-on-a-file-descriptor/m-p/7179437#M238858
تحریریه مجله اچ پی