2017-02-08 5 views
1

イム(しかし、質問は一般的なファイルのための主である)、それは次の行オープンシステムコール

fd = open(path,0); 

での作業が、次の行で失敗したのデバイスファイルを開こうとすると

fd = open(path,O_RDONLY,0777) 

(偶モード0777なし) 私はだけではなく、フラグの0をputing、なぜその作業の意味が何であるかを理解しません。

答えて

0

The POSIX specifications for open()が必要と定義された定数O_EXECO_RDONLYは、O_WRONLYO_RDWR、またはO_SEARCHがflagsに含まれるが、それらは値にこれらの定数のを指定していないの正確に一つ。確かに彼らは、理論的に、「歴史的な実装では、O_RDONLYの値はゼロです」と述べています。このような実装では、フラグを0として指定することは、O_RDONLYを指定することと同じです。

POSIXの用語「歴史的」の使用は、O_RDONLYの値が0であることはまれであることを示唆するものではありません。それどころか、現在の実装では非常に一般的です。それにもかかわらず、O_RDONLYを意味するときにフラグを0に指定しないでください。フラグ定数の定義が異なるシステムでは、コードが破壊されたままになります。

フラグが0であるが、フラグがO_RDONLY(疑わしいと思われる)ではなく実際に開くことができる場合は、O_RDONLYの値が実装と異なる場合があります。次に、必須定数グループの他のメンバの1つが値0を持ち、対応するモードでターゲットファイルを開くことができるかもしれません - たとえば、パスがディレクトリを指定していて、値があるO_SEARCH 0以外の場合は、未定義の動作がopen()から発生しています。 UBはエラーインジケータを返すようにマニフェストする必要はなく、それが起こらない場合は、何も表示されません。


補遺:(戻っ-1で示されるように)open(path, O_RDONLY)があなたのために失敗したことを考えると、perror()経由で診断を印刷することにより、errno、または、より良いを調べることによって、エラーの原因を探るために価値があるだろう。