매뉴얼 페이지의 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)또는 의심할 여지없이 nifty의 역 호출이 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
$ 

관련 정보