char *args[41];
char str[41], teststr[41];
const char delimiter[2]=" ";
memcpy(teststr, str, sizeof(str));
args[i]=strtok(teststr, delimiter);
while(args[i]!=NULL)
{
printf("args[%d]=%s\n", i, args[i]);
i++;
args[i]=strtok(NULL, delimiter);
}
这是我用来初始化args []的代码。
下面的代码是执行execvp()系统调用。
pid=fork();
if(pid==0)
{
execvp(args[0], args);
}
当我运行代码时,execvp运行很少的命令。例如,当我尝试执行'ls'命令时,它会工作,但是当我尝试运行'date'命令或'cd'命令时,它不起作用。当我尝试执行'cat'命令时,提示不会显示任何内容,同时它也不会出现。
答案 0 :(得分:0)
看起来你对如何得到你的论点有疑问,虽然你没有表明你的意见,但很难说。 strtok()
修改传递给它的字符串,因此存储指向您正在修改的字符串的指针看起来很麻烦。
这将做你想要的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUFFER_LEN 1024
#define MAX_ARGS 100
int main(void) {
char command[MAX_BUFFER_LEN];
printf("myshell> ");
fflush(stdout);
fgets(command, MAX_BUFFER_LEN, stdin);
command[strlen(command) - 1] = '\0';
char * args[MAX_ARGS];
char * temparg;
int i = 0;
temparg = strtok(command, " ");
while ( temparg ) {
args[i] = strdup(temparg);
++i;
temparg = strtok(NULL, " ");
}
i = 0;
while ( args[i] != NULL ) {
printf("Argument %d: %s\n", i + 1, args[i]);
++i;
}
pid_t my_pid = fork();
if ( my_pid == 0 ) {
execvp(args[0], args);
}
wait(NULL);
return EXIT_SUCCESS;
}
输出:
paul@MacBook:~/Documents/src/scratch$ ./exectest
myshell> cat exectest.c
Argument 1: cat
Argument 2: exectest.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_BUFFER_LEN 1024
#define MAX_ARGS 100
int main(void) {
char command[MAX_BUFFER_LEN];
printf("myshell> ");
fflush(stdout);
fgets(command, MAX_BUFFER_LEN, stdin);
command[strlen(command) - 1] = '\0';
char * args[MAX_ARGS];
char * temparg;
int i = 0;
temparg = strtok(command, " ");
while ( temparg ) {
args[i] = strdup(temparg);
++i;
temparg = strtok(NULL, " ");
}
i = 0;
while ( args[i] != NULL ) {
printf("Argument %d: %s\n", i + 1, args[i]);
++i;
}
pid_t my_pid = fork();
if ( my_pid == 0 ) {
execvp(args[0], args);
}
wait(NULL);
return EXIT_SUCCESS;
}
paul@MacBook:~/Documents/src/scratch$
为简洁起见,省略了一些错误检查。