手册页中 errno 的重复值

手册页中 errno 的重复值

我正在查看execveUbuntu 16.04 下 libc 函数的手册页。

我正在尝试按照手册页所述处理错误:

RETURN VALUE
On success, execve() does not return, on error -1 is returned, and errno is set appropriately.

所以我检查下面的错误部分,我看到:

ERRORS
   ...
   EACCES Search permission is denied on a component of the path prefix of filename or the name of a script interpreter.  (See also path_resolution(7).)

   EACCES The file or a script interpreter is not a regular file.

   EACCES Execute permission is denied for the file or a script or ELF interpreter.

   EACCES The filesystem is mounted noexec.
   ....

这是否意味着EACCES可以任何这些东西?或者可能性较小全部他们当中?

在处理 switch 语句中的错误时如何区分它们?

答案1

这是否意味着 EACCES 可能是这些东西中的任何一个?或者全部可能性较小?

任何。至于“全部”,如果存在路径遍历错误,如果代码缺乏遍历文件的权限,那么代码如何能够尝试其他事情,例如“它是常规文件吗”?返回多个错误实际上并不是 C 默认情况下所做的事情(除非您编写了一些包含错误列表的结构,然后以某种方式将指向该结构的指针返回给调用者,然后调用者需要...这不是如何大多数系统调用都是编写的。)

在处理 switch 语句中的错误时如何区分它们?

strerror(errno)err(3)或者毫无疑问反过来调用的俏皮strerror几乎是你会得到的最多的:

$ cat sirexecsalot.c
#include <err.h>
#include <string.h>
#include <unistd.h>
extern char **environ;
extern int errno;
int main(int argc, char *argv[])
{
    int ret;
    errno = 0;
    if ((ret = execve("/var/tmp/exectest/hullo", ++argv, environ)) == -1)
        err(1, "nope (strerr=%s)", strerror(errno));
}

$ make sirexecsalot
cc     sirexecsalot.c   -o sirexecsalot
$ cat /var/tmp/exectest/hullo
#!/usr/bin/env expect
puts hi

$ ./sirexecsalot
hi
$ mv /var/tmp/exectest/hullo /var/tmp/exectest/foo
$ mkdir /var/tmp/exectest/hullo
$ ./sirexecsalot              
sirexecsalot: nope (strerr=Permission denied): Permission denied
$ chmod 000 /var/tmp/exectest 
$ ./sirexecsalot             
sirexecsalot: nope (strerr=Permission denied): Permission denied
$ 

相关内容