所以这很难解释,但我会尽力而为。
我要
realloc():无效的下一个大小已终止(核心已转储)
但是只有当我尝试将向量重新分配为相同的旧大小时。
程序从终端以以下格式读取输入,最多3个参数:
p1 p1arg1 p1arg2-> p2 p2arg1 p2arg2 p2arg3
然后继续进行标记化,并获取准备使用SVC execv的路径,程序名称和参数。 (例如):
execv(prog_path,prog_args);
其中
prog_path是“ path / to / p1” 和
prog_args为“ p1”,“ p1arg1”,“ p1arg2”,NULL
PS:示例中有2个参数,但是execv需要将程序名称和NULL作为第一个和最后一个元素。
所以我有这两个函数,main只是依次调用它们:
// current terminal input
char* input;
void read_input() {
// reads input from terminal
size_t bufsize = 32;
input = (char *)malloc(bufsize * sizeof(char));
getline(&input,&bufsize,stdin);
input[strcspn(input, "\n")] = 0;
}
void op_execute() {
// Tokenize input
// Example: [prog1] [arg1] [->] [prog2] [arg1] [arg2]
char* token = strtok(input, " ");
while (1) {
// First token is program path
char* prog_path = token;
token = strtok(NULL, " ");
// Next tokens are program arguments
// First arg is prog name and last arg is NULL
char** prog_args;
prog_args = malloc(5);
char* prog_name = strrchr(prog_path,'/');
if (prog_name) {
prog_args[0] = malloc(strlen(prog_name));
strcpy(prog_args[0],prog_name);
}
else {
prog_args[0] = malloc(strlen(prog_path));
strcpy(prog_args[0],prog_path);
}
int i = 1;
while (token && strcmp(token,"->") != 0) {
prog_args[i] = (char*) malloc(strlen(token));
strcpy(prog_args[i],token);
token = strtok(NULL, " ");
i++;
}
prog_args = realloc(prog_args,(i+1));
prog_args[i] = NULL;
// TEST
printf("program: %s\n",prog_path);
for(int j=0;j<=i;j++) {
printf("arg(%d): %s\n",j,prog_args[j]);
}
if (!token) {
break;
}
token = strtok(NULL, " ");
}
}
仅当存在3个参数(0、1或2个参数)时,才会引发错误。我考虑过要检查尺寸是否相同,但感觉好像我正在解决问题。