web-dev-qa-db-ja.com

errno値を設定する方法は?

2つの異なるメソッドを2回呼び出しています。

void func1() 
{
  // do something 
  if (fail) 
  {
    // then set errno to EEXIST

  }

}

そして2番目の方法:

void func2() 
{
  // do something 
  if (fail) 
  {
    // then set errno to ENOENT

  }

}
  1. errnoをある値に設定すると、どうなりますか?エラーチェックだけですか?

  2. 上記のメソッドでerrnoを設定するにはどうすればよいですかfunc1およびfunc2からEEXISTおよびENOENT

ありがとう

28
JAN

すべての実用的な目的のために、errnoをグローバル変数のように扱うことができます(通常はそうではありません)。したがって、errno.hそしてそれを使用するだけです:

errno = ENOENT;

errnoが目的に最適なエラー報告メカニズムであるかどうかを自問する必要があります。エラーコードを返すように関数を設計できますか?

55
cnicutar

IMO、システムレベル用に設計された標準errno。私の経験はそれらを汚染しないことです。 C標準のerrnoメカニズムをシミュレートする場合、次のような定義を行うことができます。

_/* your_errno.c */
__thread int g_your_error_code;

/* your_errno.h */
extern __thread int g_your_error_code
#define set_your_errno(err) (g_your_error_code = (err))
#define your_errno (g_your_error_code)
_

また、your_perror(err_code)を実装することもできます。詳細については、glibcの実装を参照してください。

9
coanor
#include <errno.h>
void func1() 
{
  // do something 
  if (fail) 
  {
    errno = ENOENT;
  }
}
4
perreal