sourcecode

"v[0] = name-of-module"이 일반적인 표준입니까? 아니면 일반적인 규약입니까?

copyscript 2022. 8. 1. 22:39
반응형

"v[0] = name-of-module"이 일반적인 표준입니까? 아니면 일반적인 규약입니까?

를 " " " 에 할 때main() C에서는 C는 C++ 어플리케이션의argv[0]상상실실실일파일??????아니면 이것은 단지 일반적인 관례일 뿐 100% 진실이라고 보장되지 않는 것인가?

추측 작업(교육받은 추측 작업도 가능)은 재미있지만, 확실히 하기 위해서는 표준 문서를 참조할 필요가 있습니다.예를 들어 ISO C11은 다음과 같이 기술되어 있습니다(나의 강조점).

「」의 argc 0이 입니다.argv[0] 프로그램명을 나타냅니다.argv[0][0]호스트 환경에서 프로그램 이름을 사용할 수 없는 경우 null 문자가 됩니다.

따라서 해당 이름을 사용할 수 있는 경우에만 프로그램 이름입니다.또한 프로그램 이름을 "표시"하지만 반드시 프로그램 이름일 필요는 없습니다.그 전 항에는 다음과 같이 기술되어 있습니다.

「」의 argc 멤버 0이 되다( 멤버는 0입니다.argv[0] through를 통해.argv[argc-1]에는 스트링에 이러한 시작에 의해 이 부여됩니다.

이는 이전 표준인 C99와 다르지 않으며, 조차 표준에 의해 결정되지 않으며, 구현에 전적으로 달려 있습니다.

즉, 호스트 환경에서 프로그램 이름을 제공하지 않으면 프로그램 이름을 비워둘 수 있으며 호스트 환경에서 프로그램 이름을 제공하는 경우에는 "다른 것"이 프로그램 이름을 나타낼 수 있습니다.좀 더 새디스트적인 나의 순간에는 스와힐리로 번역하여 대체 암호를 통해 실행한 후 역바이트 순서로 저장하는 것을 고려하고 있다:-).

그러나 구현 정의에는 ISO 표준에서 특정한 의미가 있습니다. 구현은 구현 방법을 문서화해야 합니다.즉, UNIX에서도 원하는 것을 모두 넣을 수 있습니다.argv[0]exec콜 패밀리를 문서화할 필요가 있다(및 문서화할 필요가 있습니다.

래래 under *nixexec*() ,,argv[0]가 「」에 것은 이든지 됩니다.argv0의 의 점exec*()discl.discl.discl을 클릭합니다.

, 다른 을 따르고 있습니다. 이 규칙은 프로그램명 또는 프로그램명, 프로그램명, 프로그램명 등입니다.argv[0]보통 프로그램 이름입니다.

, 은 UNIX를 호출할 수 .exec() 만들어 내다argv[0]마음에 드는 것은 무엇이든 C기준에 따라서는 100% 믿을 수 없습니다.

C++ 표준에 따라 섹션 3.6.1:

argv[0]는 프로그램 또는 ""를 호출하는 데 사용되는 이름을 나타내는 NTMBS의 첫 번째 문자에 대한 포인터입니다.

따라서 적어도 기준으로는 보장되지 않는다.

ISO-IEC 9899 상태:

5.1.2.1 프로그램 부팅

값이 0보다 클 경우 가 가리키는 문자열은 프로그램 이름을 나타냅니다.프로그램 이름을 호스트 환경에서 사용할 수 없는 경우 늘 문자가 됩니다.값이 1보다 클 경우 ~을 가리킨 문자열은 프로그램 파라미터를 나타냅니다.

사용방법:

#if defined(_WIN32)
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    return GetModuleFileNameA(NULL, pathName, (DWORD)pathNameCapacity);
  }
#elif defined(__linux__) /* elif of: #if defined(_WIN32) */
  #include <unistd.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    size_t pathNameSize = readlink("/proc/self/exe", pathName, pathNameCapacity - 1);
    pathName[pathNameSize] = '\0';
    return pathNameSize;
  }
#elif defined(__APPLE__) /* elif of: #elif defined(__linux__) */
  #include <mach-o/dyld.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    uint32_t pathNameSize = 0;

    _NSGetExecutablePath(NULL, &pathNameSize);

    if (pathNameSize > pathNameCapacity)
      pathNameSize = pathNameCapacity;

    if (!_NSGetExecutablePath(pathName, &pathNameSize))
    {
      char real[PATH_MAX];

      if (realpath(pathName, real) != NULL)
      {
        pathNameSize = strlen(real);
        strncpy(pathName, real, pathNameSize);
      }

      return pathNameSize;
    }

    return 0;
  }
#else /* else of: #elif defined(__APPLE__) */
  #error provide your own implementation
#endif /* end of: #if defined(_WIN32) */

그런 다음 문자열을 구문 분석하여 경로에서 실행 파일 이름을 추출하면 됩니다.

argv[0] !=

  • 합니다.argv[0][0] == '-'. , 에는 .Default 파일(예: .Default 파일)이/etc/profile.

    자체 "init"입니다.getty에 앞에 있는 .-, 「https://unix.stackexchange.com/questions/299408/how-to-login-automatically-without-typing-the-root-username-or-password-in-build/300152#300152」도 참조해 주세요.

  • 멀티콜 바이너리, 특히 Busybox.이러한 심볼은 여러 이름을 링크합니다./bin/sh ★★★★★★★★★★★★★★★★★」/bin/ls 가능한1개의 명령어로/bin/busyboxargv[0].

    이를 통해 여러 도구를 나타내는 하나의 작은 정적 링크 실행 파일을 만들 수 있으며 기본적으로 모든 Linux 환경에서 작동합니다.

참고 항목: https://unix.stackexchange.com/questions/315812/why-does-argv-include-the-program-name/315817

한 POSIX POSIXexecve:argv[0] !=

언급은 ★★★★★★★★★★★★★★.exec예가

교류

#define _XOPEN_SOURCE 700
#include <unistd.h>

int main(void) {
    char *argv[] = {"yada yada", NULL};
    char *envp[] = {NULL};
    execve("b.out", argv, envp);
}

기원전

#include <stdio.h>

int main(int argc, char **argv) {
    puts(argv[0]);
}

그 후, 다음과 같이 입력합니다.

gcc a.c -o a.out
gcc b.c -o b.out
./a.out

제공 내용:

yada yada

ㅇㅇ.argv[0]하다

Ubuntu 16.10에서 테스트.

페이지에는 다음과 같은 내용이 있습니다.

argv[0] 요소는 보통 프로그램 이름을 포함하지만, 이 이름을 신뢰해서는 안 됩니다.어쨌든 프로그램이 자신의 이름을 모르는 것은 드문 일입니다.

그러나 다른 페이지는 항상 실행 파일의 이름이라는 사실을 뒷받침하는 것으로 보입니다.이것은 다음과 같이 기술되어 있습니다.

argv[0]는 프로그램 자체의 경로 및 이름입니다.이를 통해 프로그램은 자신에 대한 정보를 검색할 수 있습니다.또한 프로그램 인수 배열에 하나 더 추가되므로 명령줄 인수를 가져올 때 자주 발생하는 오류는 argv[1]를 원하는 경우 argv[0]를 잡는 것입니다.

그것이 거의 보편적인 관습인지 표준인지는 잘 모르겠지만, 어느 쪽이든 당신은 그것을 따라야 합니다.단, Unix 및 Unix와 유사한 시스템 이외에서 악용되는 것은 본 적이 없습니다.Unix 환경(특히 옛날에는)에서는 호출되는 이름에 따라 프로그램이 상당히 다른 동작을 가질 수 있습니다.

편집: 다른 게시물에서도 누군가가 특정 기준에서 나온 것으로 확인했지만, 규약이 기준보다 훨씬 앞서 있다고 확신합니다.

Workbench argv[0]에서 Amiga 프로그램을 시작하면 CLI에서만 설정되지 않습니다.

언급URL : https://stackoverflow.com/questions/2050961/is-argv0-name-of-executable-an-accepted-standard-or-just-a-common-conventi

반응형