我正在查看execve
Ubuntu 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
$