質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.24%

  • Perl

    363questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Inappropriate ioctl for deviceのエラー原因がわからない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 920

komicool

score 1

my $fname = "test.dmp";
open(INF, ">:raw" , $fname) || die "\nCan't open $fname for writing: $!\n";
(後略)


以上のコードを実行したところ、無事ファイルを開ける(作成できる)のですが、「デバイスに不適切な ioctl です(Inappropriate ioctl for device)」というエラーが発生して$!に収納されているようです。

以後の処理をみても特に実害はなく些細なエラーのように思えるのですが、原因が不明でなんとも気持ち悪いので、ぜひとも考えうる原因・解決策についてご教示いただきたいです。

実行環境はRedhatの7.3で、Perlのバージョンはv5.16.3です。
ご回答よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

perlのopenは開いたファイルがttyかどうかを判定するためにTCGETSというioctlを使っています。これはttyじゃないとエラーを返すので、エラーが返ってこなければttyで、エラーが返ってきたらttyではないとわかるという訳です。この処理のためにerrnoが汚れてしまい、たまたまそのまま残っているので$!を参照するとそのように見えてしまいますが、perlのopenがエラーを返していないのであれば気にする必要はありません。$!はエラーを検出した直後にそのエラーが何であったか知るために使うもので、それ以外のタイミングで参照した場合何が入っているかはわからないので値に意味はないのです。

% touch foo
% strace perl -e 'open F, "<foo" or die "open error $!"'
...略
open("foo", O_RDONLY)                   = 3
ioctl(3, TCGETS, 0x7ffeede80540)        = -1 ENOTTY (Inappropriate ioctl for device)
...略

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/28 01:31

    ありがとうございます。おかげさまで、だいぶ理解がすすみました。
    もう1点だけ確認させていただきたいのですが、$!の値がリセットされる条件などは存在するのでしょうか。

    と言いますのも、スクリプトの末尾で、die "Problem happened: $!\n" if $!;
    という一文を書いて処理の途中でエラーが発生していないか確認していたのですが、ttyでないファイルにopenを用いる処理があるAとBというスクリプトに関して

    Aはif $!に引っかからないのに対して、Bはif $!に引っかかっるという事象が発生して困惑しております(A、Bともにopenの直後にdie "Problem happened: $!\n" if $!;を挿入すると「デバイスに不適切な ioctl です」というエラーが発生することは確認済みです)

    キャンセル

  • 2017/06/28 07:08

    マニュアルによれば、一部のシステムコールやライブラリ関数には戻り値でエラーを示すことができないので呼ぶ前にerrnoに0を設定しておき呼んだ後に0以外になっていることでエラーを判定するものがあるということなので、そういうものを使っているのかもしれません。

    > いくつかのシステムコールやライブラリ関数 (例えば getpriority(2)) では、成功した場合の有効な返り値として -1 が返されることがある。 このような場合、成功なのかエラーなのかを区別するためには、 呼び出しの前に errno を 0 に設定しておけばよい。呼び出しの返り値がエラー発生の可能性を 示すものだった場合には、 errno が 0 以外の値かを見て確認すればよい。

    [errnoのマニュアル](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/errno.3.html)

    キャンセル

  • 2017/06/29 23:26

    よくわかりました。errnoの補足も含め、丁寧な回答ありがとうございました。助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.24%

関連した質問

同じタグがついた質問を見る

  • Perl

    363questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。