"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 *nix
exec*()
,,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/busybox
argv[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
'sourcecode' 카테고리의 다른 글
Vuejs. $v와 $event는 Vuejs로 무엇을 의미합니까? (0) | 2022.08.01 |
---|---|
검색 중에 로드 아이콘을 추가하는 방법(Vue.js 2) (0) | 2022.08.01 |
gdb에서 백슬래시 이스케이프를 표시하지 않고 늘 종단 문자열과 줄 바꿈을 인쇄하려면 어떻게 해야 합니까? (0) | 2022.08.01 |
투명 배경을 사용하여 OpenGL 렌더링 컨텍스트를 만드는 방법 (0) | 2022.08.01 |
Recyserview가 CreateView를 호출하지 않음홀더 (0) | 2022.08.01 |