正直なところ、次のことがどのように起こるのかわかりません。コードは次のとおりです。
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() は、基本的に入力された文字列の「配列」である char** を返し、各 char* には単語が含まれます。たとえば、「hello people of earth」と入力すると、結果は ["hello", "people", "of", "earth"] になります。この関数は常に機能します。
最初の反復では、すべてが期待どおりに機能します。たとえば、「date」と入力すると、出力は次のようになります。
0: date
date
date
/usr/bin/date
and then the date is displayed
しかし、2回目の繰り返しで、入力として「日付」を再度使用すると、出力は次のようになります。
0:date
edate
/usr/bin/datedate
and the date command is not issued
2 番目の printf ステートメントは、「hello」のような定数文字列を出力しても、最初の繰り返しの後に常に「e」を出力します。そして、コマンドポインターには「日付」が1つしかありませんが、パラメーター[0]にはどういうわけか2つの「日付」があります。
そして 3 回目の反復の後、プログラムはユーザー入力を待たず、ノンストップでループし、「PM: 警告、プロセス テーブルがいっぱいです!」と表示します。
何が原因でしょうか?
C用のccコンパイラを使用してMINIX 3.1.0で作業しています
編集: 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;