문제는 temp
이 단일 포인터이므로 execvp()
에 대한 포인터 배열을 전달해야한다는 것입니다.같은
뭔가 : 인수 목록은 단지 main()
에서 argv[argc] == NULL
처럼 터미네이터로 널 포인터를받은 것을
enum { MAX_ARGS = 64 };
char *args[MAX_ARGS];
char **next = args;
temp = strtok(line, " ");
while (temp != NULL)
{
*next++ = temp;
printf("%s\n", temp);
temp = strtok(NULL, " ");
}
*next = NULL;
execvp(args[0], args);
참고. 분명히, 나는 오류 검사 (만약 당신이 63 개 이상의 인수를 넘겨 준다면, args
배열을 오버 플로우시킬 것이다)를 생각해 보지 않았다. 그러나 여기에는 핵심 아이디어가 포함되어 있습니다. 이 예제와
, 내가 일을 ls
의 간단한 명령을받을 수없는 것, 내가 mkdir
및 echo
시도하고 그들이 잘 작동하는 것 같다. ls
을 전달하면 execvp()
에서 -1이 반환됩니다.
나는 문제가 무엇인지 잘 모르겠어요 - 나를 위해이 모든 작업을 :
ls
ls -l
ls -l madump.c
(madump.c
이 디렉토리에있는 파일 될 일이 어디 내가 테스트 중이 야)
코드는 다음과 같습니다.
나는 그것의 이름 끝에 줄 바꿈이있는 디렉토리를 생성 한 후,
strtok()
토큰 목록에
\n
을 추가
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
char line[1024];
while (fgets(line, sizeof(line), stdin) != NULL)
{
if (strcmp(line, "exit\n") == 0)
exit(EXIT_SUCCESS);
char *args[64];
char **next = args;
char *temp = strtok(line, " \n");
while (temp != NULL)
{
*next++ = temp;
printf("%s\n", temp);
temp = strtok(NULL, " \n");
}
*next = NULL;
puts("Checking:");
for (next = args; *next != 0; next++)
puts(*next);
execvp(args[0], args);
}
return EXIT_SUCCESS;
}
참고. 성가신 친구들과 교묘 한 반 (半) 교육 수준의 적들에게는 좋지만 다른 대부분의 관점에서는 불쾌합니다. 실제로 그렇게하기 전에 execvp()
으로 전달 될 데이터를 어떻게 출력하는지 주목하십시오. 종종 puts()
대신 printf("<<%s>>\n", *next);
을 사용하여 인수의 시작 및 끝 위치를 명확하게 나타낼 수 있습니다.
명령 (doit
)를 실행의 출력했다 :
$ ./doit
ls -l madump.c
ls
-l
madump.c
Checking:
ls
-l
madump.c
-rw-r--r-- 1 jleffler staff 2352 Jul 28 2011 madump.c
$
당신이 당신의 버전 거죠 무엇
?
'argc' 또는'argv'를 사용하지 않으므로'int main (void)'를 사용할 수 있습니다. 필자는 습관적으로 사용하는 컴파일러 옵션으로 몇 가지 경고를 방지합니다. –
@JonathanLeffler 나중에 사용하겠습니다. 지금은이 시점에 있지 않습니다. – caerulean
충분하지만 - SSCCE ([짧은, 자체 포함, 올바른 예 (http://sscce.org/)])의 경우, 축소 된 예제에 중요하지 않은 모든 것을 제거하려고 노력합니다. 사소한 문제입니다. 아주 미미합니다. 대부분의 프로그램은 당신보다 저격에 훨씬 더 많은 기회를 제공합니다. –