`execve()`의 `argv[0]`은 `pathname` 인수의 기본 이름 부분과 동일해야 합니까?

`execve()`의 `argv[0]`은 `pathname` 인수의 기본 이름 부분과 동일해야 합니까?

존재하다

#include <unistd.h>
int execve(const char * pathname , char *const  argv [], char *const  envp []);

argv [0]of는 새 프로그램의 주요 기능 execve에 해당하므로 일반적으로 인수의 기본 이름 부분과 동일합니다. 이것이 우리가 항상 따라야 하는 요구 사항입니까?argv[0]pathname

프로그램 파일이 다른 값으로 호출될 수 있는 경우 argv[0], 이 규칙/관례는 프로그램 파일을 호출하고 특정 값을 갖기를 원할 때 argv[0]해당 값 main()으로 명명된 프로그램 파일에 대한 심볼릭 링크를 생성하고 argv[0]심볼릭 링크 호출 프로그램? 아니면 반드시 그렇지는 않습니까? 예를 들어,"argv에 프로그램 이름이 포함된 이유는 무엇입니까?"에 대한 답변입니다.설명하다

argv[0]그렇다면 Bash는 POSIX 모드에서 실행됩니다 sh. 로 시작 하면 argv[0]로그인 쉘로 실행됩니다 -.

이게 무슨 뜻이야?

  • POSIX 모드에서 bash를 호출하려면 심볼릭 링크를 생성 /path/to/sh하고 string을 가리켜 /bin/bashbash 를 호출해야 합니다 . 이것이 문자열을 가리키는 것 보다 낫고 문제가 되지 않습니까 ?execve("/path/to/sh", argv, ...)argv[0]"sh"execve("/bin/bash", argv, ...)argv[1]"--posix"argv[0]

  • bash를 로그인 셸로 호출하려면 기호 링크를 만들고 /path/to/-문자열 ? 를 가리켜 /bin/bashbash 를 호출해야 합니다 . 이 방법이 문자열의 위치를 ​​가리키는 것보다 바람직하며 중요하지 않습니까?execve("/path/to/-", argv, ...)argv[0]"-"execve("/bin/bash", argv, ...)argv[1]"--login"argv[0]

argv [0]언제 유용합니까 execve ?아니 똑같다pathname매개변수의 기본 이름의 일부로 ?

답변1

귀하가 링크한 질문에 대한 답변은 다음과 같습니다.

먼저, 반드시 argv[0]프로그램 이름일 필요는 없다는 점에 유의하세요.

이것은 주요 문제를 해결합니다.

출시 계획에 대한 다양한 질문은 오해에서 비롯된 것 같습니다. 이름 이외의 값으로 설정된 프로그램을 실행하기 위해 링크(기호 링크 또는 하드 링크)를 사용할 필요는 없습니다. argv[0]주어진 배열을 제어할 수 있어야 합니다 execve. login쉘이 시작될 때 수행하는 작업은 다음 과 같습니다 . -in 접두사가 붙습니다.argv[0]

argv[0]Bash 는 시작 시 POSIX 모드로 시작 sh되므로 /bin/sh.--posix

동일한 추론이 -로그인 쉘에도 적용됩니다. 이 규칙은 --login옵션 지원 여부에 관계없이 모든 쉘에 적용됩니다.

로그인 사용 사례는 argv[0]프로그램 이름과 동일하지 않은 유용한 예입니다.

관련 정보