سؤال

ولدي مخطوطة برل تشغيل في مربع AIX.

والبرنامج النصي يحاول فتح ملف من دليل معين وأنه فشل في قراءة الملف لأن الملف لا يوجد لديه إذن القراءة، ولكن أحصل على خطأ قائلا مختلفة inappropriate ioctl for device.

لا يجب أن تقول شيئا مثل no read permissions for file أو شيئا من هذا القبيل؟

وماذا تعني هذه الرسالة inappropriate ioctl for device؟

وكيف يمكنني إصلاحه؟

وتحرير: وهذا هو ما وجدته عندما فعلت strace

open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 
    0666) = 4 _llseek(4, 0, [77146], SEEK_END) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY 
    (Inappropriate ioctl for  device)
هل كانت مفيدة؟

المحلول

وعلى الأرجح فإن ذلك يعني أن فتح <م> لم تفشل .

عند فتح ملف بيرل، فإنه يتحقق ما إذا كان الملف هو TTY (بحيث تستطيع الرد على المشغل -T $fh filetest) من خلال إصدار IOCTL TCGETS ضدها. إذا كان الملف هو ملف العادي وليس الكتابة البعيدة، يفشل IOCTL ومجموعات errno إلى ENOTTY (قيمة السلسلة: "IOCTL غير لائقة لجهاز"). كما ysth يقول، والسبب الأكثر شيوعا لرؤية قيمة غير متوقعة في $! هو التحقق عندما انها ليست صحيحة - وهذا هو، في أي مكان <م> البعض من مباشرة بعد فشل syscall، لذلك اختبار رموز نتيجة لبك عمليات أمر مهم للغاية.

إذا open فعل فعلا عودة كاذبة بالنسبة لك، ويمكنك العثور عليها في ENOTTY $! ثم أود أن نعتبر هذه الشوائب الصغيرة (إعطاء قيمة غير مجدية من $!) ولكن أود أيضا أن يكون من الغريب جدا عن كيفية وقوعه. سيكون رمز و/ أو الإخراج الجمالون يكون أنيق.

نصائح أخرى

وأخطاء غريبة مثل "IOCTL غير مناسب للجهاز" عادة ما تكون نتيجة فحص $! في مرحلة ما عدا فقط بعد فشل استدعاء نظام. إذا كنت عرض الكود الخاص بك، وأراهن أن شخصا ما يشير بسرعة من خطأ الخاص بك.

و"الملفات" في أنظمة نوع * لا شيء الى حد كبير جدا مفهوما مجردا.

ويمكن أن تكون المناطق على القرص عن طريق نظام ملفات المنظمة، ولكنها يمكن أن تكون على قدم المساواة جيدا اتصال الشبكة، وقليلا من الذاكرة المشتركة، وإخراج عازلة من عملية أخرى، على الشاشة أو لوحة المفاتيح.

في أجل بيرل لتكون مفيدة حقا يعكس هذا النموذج بشكل وثيق جدا، ولا علاج الملفات عن طريق محاكاة شريط ممغنط يصل الى 4gls القيام به.

لذلك حاول ل"IOCTL" عملية "مفتوحة للكتابة" على مؤشر ملف الذي لا يسمح عمليات الكتابة وهي عملية IOCTL غير لائقة لهذا الجهاز / الملف.

وأسهل شيء نفعله هو التمسك ب "بيان or die 'Cannot open $myfile' في نهاية منكم مفتوحة ويمكنك اختيار رسالة ذات مغزى الخاصة.

و"IOCTL غير مناسب للجهاز" عبارة عن سلسلة خطأ لخطأ ENOTTY. كان عليه أن يكون triggerred في المقام الأول من محاولات لتكوين خصائص محطة (وضع مثل الصدى) على واصف الملف الذي لم محطة (ولكن، يقول، ملف العادية)، وبالتالي ENOTTY. أكثر عموما، يتم تشغيل عند إجراء IOCTL على جهاز لا يدعم هذا IOCTL، وبالتالي سلسلة الخطأ.

لمعرفة ما يجري إحراز IOCTL فشل ذلك، وعلى أي ملف واصف، تشغيل البرنامج النصي تحت strace / الجمالون. عليك أن تعترف ENOTTY، تليها الطباعة الفعلية من رسالة الخطأ. ثم معرفة ما تم استخدام رقم الملف، وما مفتوحة () دعوة عاد هذا العدد الملف.

وأنا فقط إصلاح هذا الخطأ بيرل. انظر https://rt.perl.org/Ticket/Display.html؟id= 124232

عند ندفع طبقة عازلة لPerlIO والقيام الاختيار فشل isatty () الذي فشل الواضح على كافة الملفات العادية، تجاهل ENOTTY errno الخطأ.

وجدتها لحظة!

ولقد كان هذا الخطأ من قبل.

هل استدعاء المصحح بيرل مع شيء من هذا القبيل: -

perl -d yourprog.pl > log.txt

وإذا كان الأمر كذلك ما يحدث هو يحاول بيرل التصحيح للاستعلام وربما إعادة عرض المحطة الطرفية. عندما المعياري ليست محطة فشل هذا مع رسالة IOCTL.

والبديل سيكون لجلسة تصحيح أخطاء لشنق إلى الأبد لأنك لا ترى موجه للتعليمات.

وبما أن هذا هو خطأ فادح وأيضا من الصعب جدا أن التصحيح، وربما الإصلاح يمكن أن توضع في مكان ما (في سطر الأوامر المتوفرة؟):

export GPG_TTY=$(tty)

ومن: https://github.com/keybase/keybase-issues/issues / 2798

وران إلى هذا الخطأ اليوم بينما كان يحاول استخدام التعليمات البرمجية لحذف مجلد / الملفات التي تعيش على مربع Windoze 7 ان تصاعدت كحصة في الخادم سينت أو إس. حصلت على icotl غير مناسب للخطأ الجهاز وحاولت كل شيء أن تتبادر إلى الذهن. قرأت للتو عن كل وظيفة على النت المتعلقة بذلك.

ومن الواضح أن تم عزل المشكلة إلى مشاركة Windoze التي شنت على خادم لينكس. بدا وكان في أذونات الملف على مربع Windoze وأشار إلى الملفات الأذونات الخاصة بهم لتعيين قراءة فقط.

وتغيير تلك، عاد إلى خادم لينكس، وعملت جميع كما هو متوقع. هذا قد لا يكون الحل لمعظم ولكن نأمل أن يحفظ شخص بعض الوقت.

وحاولت التعليمات البرمجية التالية التي بدا العمل:

if(open(my $FILE, "<File.txt")) {
    while(<$FILE>){
    print "$_";}
} else {
    print "File could not be opened or did not exists\n";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top