Я честно понятия не имею, как происходит следующее. Вот код:Неожиданный вывод после первой итерации этого кода
while(1)
{
char** line = read_command();
char* command = line[0];
char** parameters = malloc(100);
int i;
for(i = 0; i < pNum; i++) // pNum is a global var containing the number of words read from read_command()
{
parameters[i] = line[i];
printf("%i: %s", i, parameters[i]);
}
printf("%s\n", parameters[0]);
parameters[0] = "/usr/bin/";
strcat(parameters[0], command);
printf("%s\n", command);
printf("%s\n", parameters[0]);
if(fork() != 0)
waitpid(1, &status, 0);
else
execve(parameters[0], parameters, NULL);
}
read_command() возвращает символ **, который в основном является «массив» на строку, которая была введена, и каждый символ * содержит слово. В результате, если я войду в «привет людей земли», результатом будет [«привет», «люди», «из», «земля»]. Эта функция всегда работает.
при первой итерации все работает так, как ожидалось. Например, когда я типа «дата» выход заключается в следующем:
0: date
date
date
/usr/bin/date
and then the date is displayed
а на второй итерации, если я использую «дата» в качестве входного сигнала снова выход следующим образом:
0:date
edate
/usr/bin/datedate
and the date command is not issued
в второй оператор printf всегда печатает «e» после первой итерации, даже если я печатаю постоянную строку типа «привет». а затем параметры [0] каким-то образом имеют в себе 2 «дату», хотя указатель команды имеет только 1 «дату».
И после третьей итерации программа не ждет ввода пользователя, она просто перестает останавливаться и отображает «PM: предупреждение, таблица процессов заполнена!».
Что может быть причиной этого?
Я работаю в MINIX 3.1.0 с куб.см компилятор для C
EDIT: в read_command():
char* line = malloc(), * linep = line;
size_t lenmax = 100, len = lenmax;
int c;
int currPos = 0;
int currParam = 0;
int i;
char** parameters = malloc(100);
if(line == NULL)
return NULL;
while(1)
{
c = fgetc(stdin);
if(c == EOF) || c == '\n')
break;
if(--len == 0)
{
char* linen = realloc(linep, lenmax *= 2);
len = lenmax;
if(linen == NULL)
{
free(linep);
return NULL;
}
line = linen + (line - linep);
linep = linen;
}
if((*line++ = c) == '\n')
break;
}
*line = '\0'; // everything up to this point i got from this link: http://stackoverflow.com/a/314422/509914
parameters[currentParam] = malloc(100);
for(i = 0; i < strlen(linep); i++);
{
if(isspace(linep[i]) || line[i] == EOF)
{
parameters[currParam][currPos] = '\0;
currPos = 0;
parameters[++currParam] = malloc(100);
}
else
parameters[currParam][currPos++] = line[i];
}
parameters[currParam][currPos] = '\0';
pNum = currParam + 1;
return parameters;
Ваш 'printf ("% i:% s ", параметры [i]);' требуется два значения, а не один. Вероятно, это должно быть: 'printf ("% i:% s ", i, параметры [i]);' – cdarke
'char ** parameters = malloc (100);' выделяет 100 байт, а не 100 лотов 'char * '. Возможно, вы имели в виду параметры 'char ** parameters = malloc (pNum * sizeof *),' – Sebivor
@cdarke, спасибо, я изменил его. Это правильно в моем коде. –