偶尔(例如使用strace,gdb等等)人们会发现一个POSIX调用集errno是一个整数值,而一个人想知道编译时间C常数(更准确地是由预处理器定义)来检查它(例如ECHILD)-参见例如等待子进程的pid没有成功。
上面链接的问题中的EG,在10中返回了整数错误号errno。我想从那儿回到琴弦上ECHILD。不给我什么perror或strerror给我什么(“没有子进程”或类似的东西)。
这是这样做的明显方法,该方法不起作用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char **argv)
{
printf ("%s\n", strerror (10));
exit (0);
}
Run Code Online (Sandbox Code Playgroud)
打印输出:
No child processes
Run Code Online (Sandbox Code Playgroud)
不是ECHILD,因此不执行所需的操作。
有什么比手动grep完成更简单的方法/usr/include吗?
您可能认为重复的事物,但并非如此:
如何将UNIX中的errno转换为相应的字符串?-说strerror(很明显)将整数转换为人类可读的字符串,并perror打印出来。我不想那样做。我想打印符号等效项,即可以用来测试的预处理器定义errno。
Linux,将errno转换为name-更接近,但正在寻找API调用。显然,其中没有一个。接受的答案还错误地指出了错误所在errno.h-在我的系统中,错误分散在多个文件之间,使搜索更有趣。如何在C中打印errno的符号名称?类似。
适当的答案可能涉及一些魔术,以预处理的适当部分/usr/include并显示E以适当值开头的任何常数。
我正在使用系统调用,如果失败,我需要为不同的errnos做不同的事情.
我需要编写看起来像这样的代码:
int res;
res = systemCall();
if (res == -1)
{
if (errno == ENOMSG)
{
doSomething();
}
else
{
doSomethingElse();
}
}
Run Code Online (Sandbox Code Playgroud)
perror没有帮助,因为它只打印值.
至于strerro - 如果它是我需要的,我不是如何使用它,因为在这里它说实际的字符串与错误不同.从手册页引用:"(例如,如果errnum是EINVAL,则返回的描述将是"Invalid argument")".
我正在使用Linux.系统调用:msgsend和msgrcv(https://linux.die.net/man/2/msgrcv).我不确定你问的C库是什么.
我看到我没有很好地解释自己.
语句if(errno == ENOMSG)是否有效?是否有这样的变量errno?基本上我的问题是:if为了测试errno ,在声明中应该怎么做?