C

手冊頁中 errno 的重複值

  • July 13, 2017

我正在查看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 語句中的錯誤時,如何區分它們?

這是否意味著 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
$ 

引用自:https://unix.stackexchange.com/questions/378319