【问题标题】:pthread error numbers: negated or not?pthread 错误编号:是否否定?
【发布时间】:2023-04-07 02:06:01
【问题描述】:

查看pthread_* 函数的文档,例如pthread_rwlock_destroy 和许多其他函数,文档是这样写的:

返回值

如果成功,pthread_rwlock_destroy() 和 pthread_rwlock_init() 函数将返回零;否则,将返回错误号以指示错误。

[EBUSY] 和 [EINVAL] 错误检查,如果实施,就好像它们在函数处理开始时立即执行,并在修改由指定的读写锁的状态之前导致错误返回rwlock。

这表示如果发生错误,一个错误号应该被返回。然后,它解释了错误代码:

错误

如果出现以下情况,pthread_rwlock_destroy() 函数可能会失败:

[忙]
实现检测到尝试在锁定时销毁 rwlock 引用的对象。
...

其中没有提到是返回EBUSY 本身还是返回-EBUSY。当函数返回错误代码时,几乎在所有我看到的地方,它们都会返回-E*****

这是否意味着pthread_* 函数也遵循这个约定?我应该对照-EBUSYEBUSY 本身检查返回值吗?

在同一主题上,他们会将EBUSY 存储在errno-EBUSY 中吗?

【问题讨论】:

  • EBUSY != -EBUSY .. 我不明白负数的来源。
  • 与内核实现细节混淆。
  • @pst, EBUSY != -EBUSY,因此您需要知道返回的是EBUSY 还是-EBUSY。通常错误代码被定义为正数,然后在它们后面加上一个减号。所以......负数出现在他们放置-的位置?还是我完全误解了你的评论?
  • 您既不应该检查>0 也不应该检查<0,而应该检查!=0 ...如果没有成功,那一定是失败了! ;-)
  • @alk,叹息……是的。然后你想检查它失败的原因,即你应该对照EBUSY-EBUSY检查返回值。我在问哪个是正确的。

标签: c pthreads errno error-code


【解决方案1】:

它们返回正数的错误代码。应用程序不可见的任何内容都不会返回否定的错误代码。这是内核的一个实现细节。

【讨论】:

  • Were "They" 详细表示pthread_* 系列函数。大多数系统调用只是在成功时返回 0,在错误时返回 -1,同时将 errno 设置为 E* 错误代码集中的正值。
  • 这很有趣,我在 github 中搜索了“return EBUSY”和“return EINVAL”(在代码中),我确实看到pthread_* 函数本身返回了E* 值。然而,其他一切似乎都返回-E*。同时,所有其他一切似乎都与内核有关!
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多