2017-04-20 14 views
-1
int fd; 
fd=io->fd.open(filename,O_RDONLY|O_BINARY); 
string_s=strerror(error); 

結果はconfusing.fd = 3であり、string_sは「そのようなファイルまたはディレクトリはありません」です。 私は、ファイル名はfdがない理由-1ファイル記述子が間違った値を返す

+0

ファイル名が正しい場合、なぜfdを-1にする必要がありますか? – Gerhardh

答えて

3

関数呼び出しが失敗しない場合は、errnoの値は未定義すべてright.Butであると確信しています。 errnoをチェックする前に、関数が失敗したかどうかをチェックする必要があります。

+0

C言語のオープン関数を調べるにはどうすればいいですか?io-> fd.openはCの関数です。 – user7896331

+1

@ user7896331関数が '-1'を返したかどうかをチェックします。例えば。 'if(fd == -1){printf("%s \ n "、strerror(errno)); } ' –

2

errnoは決してライブラリ呼び出しでをクリアしません。 C11標準のドラフトn1570は(7.5p3)以下の言葉:

初期スレッドでerrnoの値は、プログラムの起動(他のスレッドでerrnoの初期値は不定値である)、でゼロではなくなることはありません任意のライブラリ関数によってゼロに設定されます。 errnoの値は、この国際規格の関数の記述にerrnoの使用が記述されていない限り、エラーがあってもなくても、ライブラリ関数呼び出しによって0以外の値に設定されてもよい。

つまり、errnoは以前の失敗したシステムコールの値が0ではありません。 openが成功しました。

あなたは常に明示的に0に自分自身をerrnoを設定することができます。

errno = 0; 
fd = io->fd.open(filename, O_RDONLY | O_BINARY); 

をし、それが成功したライブラリ・コールの後に0のままであるべきです。

関連する問題