일반적인 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]
로그인 쉘로 실행됩니다-
. vi
view
Vim은 , ,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.