argv에 프로그램 이름이 포함된 이유는 무엇입니까?

argv에 프로그램 이름이 포함된 이유는 무엇입니까?

일반적인 Unix/Linux 프로그램은 명령줄 입력을 인수 개수( int argc) 및 인수 벡터( char *argv[])로 받아들입니다. 첫 번째 요소 argv는 프로그램 이름이며 그 뒤에는 실제 매개변수가 옵니다.

프로그램 이름이 실행 파일에 인수로 전달되는 이유는 무엇입니까? 자신의 이름을 사용하는 프로그램의 예가 있습니까(어쩌면 exec상황에 따라)?

답변1

먼저, 반드시 argv[0]프로그램 이름일 필요는 없다는 점에 유의하세요. 이것은 호출자가 argv[0]시스템 호출에 넣는 것입니다 execve(예를 참조하십시오).스택 오버플로에 대한 이 질문). (다른 모든 변형은 exec시스템 호출이 아니라 인터페이스입니다 execve.)

예를 들어 다음 상황을 가정합니다( 사용 execl).

execl("/var/tmp/mybackdoor", "top", NULL);

/var/tmp/mybackdoor은 실행되지만 argv[0]로 설정됩니다 top. 이는 ps또는 (실제) top표시되는 것입니다. 바라보다이 답변자세한 내용은 U&L SE를 방문하세요.

모든 것을 제쳐두고 : /proc. argv[0]이점은 무엇입니까?

  • 일부 프로그램은 호출되는 이름에 따라 이름이 지정됩니다(보통 기호나 하드 링크를 통해).BusyBox 유틸리티;이 질문에 대한 다른 답변에 더 많은 예가 제공됩니다.
  • 또한 syslog를 통해 기록된 서비스, 데몬 및 기타 프로그램은 종종 로그 항목에 이름을 추가하므로 이벤트 추적이 거의 불가능합니다.

답변2

적절한:

  • 배쉬는 계속 실행됩니다POSIX 모드언제 .argv[0] 로 시작 sh하면 argv[0]로그인 쉘로 실행됩니다 -.
  • viviewVim은 , , evim, eview, 등 으로 실행될 때 다르게 동작합니다 ex.vimdiff
  • 이미 언급했듯이 Busybox.
  • systemd를 init로 사용하는 시스템에서는 등이 있습니다 shutdown.reboot심볼릭 링크systemctl.
  • 등.

답변3

역사적으로 argv이는 명령줄 "단어"에 대한 포인터 배열이었으므로 프로그램 이름이었던 첫 번째 "단어"로 시작하는 것이 합리적이었습니다.

그리고 호출하는 데 사용된 이름에 따라 다르게 동작하는 프로그램이 꽤 많이 있으므로 해당 프로그램에 대한 다른 링크를 만들고 다른 "명령"을 얻으면 됩니다. 제가 생각하는 가장 극단적인 예는 다음과 같습니다.바쁜 상자, 어느호출 방법에 따라 수십 개의 다른 "명령"처럼 작동합니다..

편집하다: 요청 시 Unix 첫 번째 버전에 대한 참고 자료 제공

예를 들어 다음에서 시작할 수 있습니다.기본cc이 기능은 사용 argc되지 argv않았습니다. 이것껍데기루프 섹션 내부에 매개변수를 복사하고 parbuf, newarg명령 자체도 매개변수와 동일한 방식으로 처리합니다. (물론 나중에는 명령 이름인 첫 번째 인수만 실행합니다.) execv당시에 는 친척이 존재하지 않았던 것 같습니다 .

답변4

프로그램이 호출되는 방식에 따라 동작을 변경하는 것 외에도 argv[0]인쇄 프로그램을 다음과 같이 사용하는 것이 유용하다고 생각합니다.

printf("Usage: %s [arguments]\n", argv[0]);

이로 인해 소비 메시지는 항상 호출된 이름을 사용하게 됩니다. 프로그램 이름이 바뀌면 사용 정보도 변경됩니다. 여기에는 호출된 경로 이름도 포함됩니다.

# cat foo.c 
#include <stdio.h>
int main(int argc, char **argv) { printf("Usage: %s [arguments]\n", argv[0]); }
# gcc -Wall -o foo foo.c
# mv foo /usr/bin 
# cd /usr/bin 
# ln -s foo bar
# foo
Usage: foo [arguments]
# bar
Usage: bar [arguments]
# ./foo
Usage: ./foo [arguments]
# /usr/bin/foo
Usage: /usr/bin/foo [arguments]

이는 특히 곳곳에 흩어져 있을 수 있는 작은 전문 도구/스크립트의 경우 좋은 터치입니다.

이는 GNU 도구에서도 일반적인 관행인 것 같습니다 ls. 예를 들면 다음과 같습니다.

% ls --qq
ls: unrecognized option '--qq'
Try 'ls --help' for more information.
% /bin/ls --qq
/bin/ls: unrecognized option '--qq'
Try '/bin/ls --help' for more information.

관련 정보