Я пытаюсь сделать базовый bash с использованием системных вызовов, но у меня есть небольшие проблемы с массивом указателей.
Чтобы возобновить мой код, я читаю команды из stdin с read () в буфер, затем использую strsep () для отделения команды от аргументов и всех аргументов в массив. Затем я создаю новый процесс с помощью fork () и выполняю эту команду со связанными аргументами с помощью execvp ().
Все это входит в бесконечный цикл до тех пор, пока пользователь не наберет "выход" (еще не закодирован). Проблема в том, что после первой итерации мне нужно, чтобы * pArgs был пустым для следующей команды и аргументов. И я не знаю, как это сделать ...
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
int aCount;
pid_t pid;
while(1) {
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
read(0, bBuffer, BUFSIZ);
sPtr = bBuffer;
aCount = 0;
do {
aPtr = strsep(&sPtr, " ");
pArgs[aCount++] = aPtr;
} while(aPtr);
pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0';
// Debug code to output pArgs content
write(1, "|>", 2);
write(1, pArgs[0], strlen(pArgs[0]));
write(1, "<|", 2);
if(strlen(pArgs[0]) > 1) {
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
execvp(pArgs[0], pArgs);
exit(0);
}
}
}
return 0;
}
P.S: Извините, но я не могу предоставить тестовый пример ввода и вывода в данный момент. Надеюсь, это не так сложно понять и исправить, что вам, ребята, это не нужно. Я отправлю это позже, если это будет необходимо ...
Просто чтобы прояснить ситуацию:
Я знаю, я спросил, как очистить массив, и я получил ответ на это. Но теперь мне кажется очевидным, что моя проблема была не в этом, а в мусоре, который собирал буфер, как указано в litb. Логичнее завершать строку нулевым символом, чем очищать массив. Вот почему я отмечаю правильный ответ Литба.