例如,int fork
出错时返回-1
。错误时int pipe
也会返回-1
。错误时int socket
也会返回-1
。
我想知道,all
系统调用会在出错时返回-1
。我已经看到了带错误检查的代码,而且它们都有所不同。其中一些会return value < 0
,其中一些会return value == -1
,其中一些会return value < 1
,所以我可以做些什么来检查任何系统调用?
我必须检查什么?或者它实际上取决于系统调用?我不能总是< 0
吗?
答案 0 :(得分:3)
我想知道,所有系统调用都会在出错时返回-1。
没有。在没有提供任何实际示例的情况下,我引用POSIX 1003.1-2008, 2016 Edition:
大多数功能都可以提供错误编号。每种方式的手段 函数提供的错误号在其描述中指定。
某些函数在通过访问的变量中提供错误号 符号
errno
[...]。某些函数直接返回错误编号作为函数值。 这些函数返回零值表示成功。
通过errno
提供错误详细信息的函数也通过返回值发出信号,表明发生了(未指定的)错误。大多数此类信号采用返回值-1的形式。
你继续询问:
我见过代码 错误检查,它是完全不同的。他们中的一些人
return value < 0
,其中一些人return value == -1
,其中一些人return value < 1
,所以,如果错误检查系统调用,我该怎么办?
许多通过返回-1发出错误信号的函数不记录任何其他负返回值。对于这样的函数,测试返回值是否正好为-1并且测试它是否为负数用于相同的目的。将返回值与1进行测试并不等效,但它可能对某些特定上下文有效,例如当它用于检测功能失败和功能成功时,仍然指示应用程序级错误,例如错误的用户输入。
如引用文本所示,每个函数都记录了它发出错误信号的机制,以及如何获取相应的错误号(如果有的话)。您可以通过选择与其文档一致的任何方法来检查特定函数的错误。 POSIX在这方面包含两个主要类别的函数 - 通过返回-1来表示错误的那些函数以及通过返回任何各种非零值来表示错误的函数 - 但是有时您还需要处理其他函数。如果您不确定,最好查阅您正在使用的功能的文档。
答案 1 :(得分:2)
我该如何处理错误检查系统调用?
您无法阅读该特定系统调用的文档。没有统一的惯例。
如果将有效ID定义为始终为非负的,则通常会将-1
用于返回某种ID(进程ID,文件描述符等)的内容。