2

従来の linux c/c++ ソフトウェアで何か問題が発生した場合、魔法の変数 errno があり、何が問題なのかの手がかりが得られます。

しかし、これらのエラーはどこで定義されているのでしょうか?

例を見てみましょう (これは実際には Qt アプリの一部であるため、qDebug() です)。

if (ioctl(file, I2C_SLAVE, address) < 0) {
    int err = errno;
    qDebug() << __FILE__ << __FUNCTION__ << __LINE__ 
        << "Can't set address:" << address
        << "Errno:" << err << strerror(err);
     ....

次のステップは、その errno が何であったかを調べることです。これにより、終了するか、問題について何かを試みるかを決定できます。

したがって、この時点で if または switch を追加します。

if (err == 9)
{
    // do something...
}
else 
{
    //do someting else
}

私の質問は、「9」が表すエラーをどこで見つけるかです。私のコードでは、そのようなマジック ナンバーは好きではありません。

/ありがとう

4

4 に答える 4

13

これらは通常/usr/include/errno.h* で定義され、errno.h を含めることでアクセスできます。

#include <errno.h>

エラーを報告するときに errno 値とそのテキストの意味の両方を書き出し、次の方法でテキストの意味を取得しますstrerror()

if (something_went_wrong)
{
    log("Something went wrong: %s (%d)", strerror(errno), errno);
    return false;
}

ただし、Linux シェルからは、このperrorユーティリティを使用して、さまざまな errno 値の意味を調べることができます。

$ perror 9
OS error code   9:  Bad file descriptor

編集: シンボリック値を使用するようにコードを変更する必要があります。

if (err == EBADF)
{
    // do something...
}
else 
{
    //do someting else
}

編集 2: * 少なくとも Linux では、実際の値は/usr/include/asm-generic/{errno,errno-base}.hおよび他の場所で定義されているため、見たい場合にそれらを見つけるのが少し面倒です。

于 2011-03-15T15:25:19.623 に答える
1

通常、エラー処理を実装するには、関数によって返される特定のエラーコードを知る必要があります。この情報は、manまたはhttp://www.kernel.org/doc/man-pages/で入手できます。

たとえば、ioctl呼び出しの場合、次のコードが必要です。

   EBADF  d is not a valid descriptor.

   EFAULT argp references an inaccessible memory area.

   EINVAL Request or argp is not valid.

   ENOTTY d is not associated with a character special device.

   ENOTTY The specified request does not apply to the kind of object that the
          descriptor d references.

編集:含まれている場合<errno.h>は、考えられるすべてのエラーコードを定義するすべてのファイルも含まれているため、正確な場所を知る必要はありません。

于 2011-03-15T15:36:43.633 に答える
1
NAME
       errno - number of last error

SYNOPSIS
       #include <errno.h>

DESCRIPTION
       The  <errno.h>  header file defines the integer variable errno, which is set by system calls and some library functions in the event of an error to indicate
       what went wrong.  Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or NULL from  most
       library functions); a function that succeeds is allowed to change errno.

       Valid error numbers are all non-zero; errno is never set to zero by any system call or library function.
于 2011-03-15T15:26:05.940 に答える
0

ファイルは次のとおりです。

/usr/include/errno.h

--p

于 2011-03-15T15:27:58.870 に答える