2

私のコードopen()では、戻りコード -1 で失敗しますが、どういうわけかerrno設定されていません。

int fd;
int errno=0;
fd = open("/dev/tty0", O_RDWR | O_SYNC);
printf("errno is %d and fd is %d",errno,fd);

出力は

errno is 0 and fd is -1

errno が設定されていないのはなぜですか? open()失敗した理由を特定するにはどうすればよいですか?

4

4 に答える 4

14
int errno=0;

問題はerrno、 を再宣言したことで、グローバル シンボル (単純な変数である必要さえありません) を隠していることです。その効果は、openを設定するか、何を印刷するかということです。代わりに、標準を含める必要がありますerrno.h

于 2012-07-09T14:05:44.730 に答える
2

errno 変数を自分で定義しないでください。errno errno.h で定義されているグローバルな変数です (実際には単なる変数よりも複雑です) int errno = 0;。errno.h を含めることを忘れないでください

于 2012-07-09T14:05:42.120 に答える
2

errnoローカル変数を宣言していて、グローバルを効果的にマスクしていerrnoます。errno.hを含めて、extern errno を宣言する必要があります。

#include <errno.h>
...

extern int    errno;

...
fd = open( "/dev/tty0", O_RDWR | O_SYNC );
if ( fd < 0 ) {
    fprintf( stderr, "errno is %d\n", errno );
    ... error handling goes here ...
}

strerror()errno 整数を人間が読めるエラー メッセージに変換するために使用することもできます。string.hそのためには、次のものを含める必要があります。

#include <errno.h>
#include <string.h>

fprintf( stderr, "Error is %s (errno=%d)\n", strerror( errno ), errno );
于 2012-07-09T14:07:28.903 に答える
1

これをモジュールに追加してください:#include <errno.h> 代わりにint errno;

于 2012-07-09T14:06:51.383 に答える