답변:
따라서 함수에서 파일 이름을 두 번 전달해야합니다.
그것들은 그중 하나 가 argv[0]
값으로 사용 된다는 것을 관찰함으로써 당신이 알고있는 것과 완전히 다릅니다 . 실행 파일의 기본 이름과 같을 필요는 없습니다. 많은 / 대부분의 것들이 그것을 무시하고 거기에 원하는 것을 넣을 수 있습니다.
첫 번째는 실행 파일의 실제 경로이며, 여기에는 분명한 필요성이 있습니다. 두 번째는 호출하는 데 사용되는 이름으로 표면에 프로세스에 전달되지만 다음과 같습니다.
execl("/bin/ls", "banana", "-l", NULL);
/bin/ls
올바른 경로라고 가정 하면 잘 작동합니다 .
그러나 일부 응용 프로그램은을 사용 argv[0]
합니다. 보통 이것들은 하나 이상의 심볼릭 링크를 가지고 있습니다 $PATH
. 이것은 압축 유틸리티에서 일반적입니다 (때로는 쉘 래퍼를 대신 사용함). 이 경우 xz
, 설치 stat $(which xzcat)
프로그램을이에 대한 링크입니다 xz
, 그리고 man xzcat
동일 같다 man xz
"xzcat는 XZ --decompress --stdout에 해당"에 대해 설명한다. xz가 어떻게 호출되었는지 알 수있는 방법은 다음을 확인 argv[0]
하는 것입니다.
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
/bin/ls
busybox라면 실행 방법을 모른다 는 것을 의미합니다 banana
!
파일 이름을 두 번 전달할 필요가 없습니다.
첫 번째는 실제로 실행되는 파일입니다.
두 번째 논점은 argv[0]
프로세스가되어야하는 것, 즉 프로세스가 그 이름으로보아야하는 것입니다. 예 ls
를 들어 쉘에서 실행 하면 첫 번째 인수는 /bin/ls
이고 두 번째 인수는 ls
입니다.
특정 파일을 실행하고 두 번째 인수를 통해 다른 파일을 호출 할 수 있습니다. 프로그램은 이름을 확인하고 이름에 따라 다르게 동작 할 수 있습니다. 하드 링크 (또는 심볼릭 링크)를 통해이 작업을 수행 할 수도 있지만이 방법으로 유연성을 높일 수 있습니다.
argv[0]
링크 이름으로 설정되므로 동일한 방법 입니다.
테이크 아웃은를 argv[0]
포함하여 무엇이든 설정할 수 있습니다 NULL
. 관례 에 argv[0]
따라 실행 파일이 시작된 경로로 설정됩니다 (쉘 프로세스가 수행 할 때 execve()
).
경우 ./foo
와 dir/bar
같은 실행 파일 (하드 또는 심볼) 개의 상이한 링크는, 다음 설정 될 두 개의 경로를 이용하여 쉘에서 프로그램을 시작 argv[0]
으로 ./foo
하고 dir/bar
, 각각.
argv[0]
할 수있는 사실 NULL
은 종종 간과됩니다. 다음 코드는 NULL
argv[0]
예를 들어 충돌 할 수 있습니다 (glibc는 대신 <null> 과 같은 것을 인쇄 합니다 argv[0]
).
if (argc != 3) {
fprintf(stderr, "%s: expected 2 arguments\n", argv[0]);
exit(EXIT_FAILURE);
}
Linux의 대안 /proc/self/exe
은 이러한 경우 에 사용하는 것 입니다.
./foo
했다 dir/bar
. argv[0]
이 두 경우에 따라 다릅니다 (각 경우 사용한 경로와 동일).
argv[0]
할 때 무엇이든 설정할 수 있다는 exec*()
것입니다. argv[0]
프로그램을 시작하는 데 사용 된 경로 로 설정 하는 것은 셸의 규칙입니다. exec*()
많은 프로그램 argv[0]
이 경로를 검사 하고 유지 하기 를 기대 하기 때문에 프로그램을 실행할 때도 똑같이하는 것이 좋습니다 .
busybox
당신이 그것을 올바르게 부르는 방법에 따라 원하는 것이 될 수있는 방법을 설명 할 것입니까?