После того, как вы выполните fork (), ваш дочерний процесс выполняет 2 вызова printf, а затем продолжает выполнение цикла while (1), поэтому вы создаете 1 дополнительный процесс после каждой новой строки.
Что вам нужно сделать, это убить ребенка сразу после того, как он напечатает 2 эллипса (...
)
Измените свой код на это:
if(cpid == 0){
printf("..."); printf("..."); exec(...); exit(0);
}
Помните, что exit () вызывается только в случае сбоя exec ().
Edit:
Если вы намереваетесь принять ввод для какого-либо интерпретатора командной строки, readline - не очень хороший вариант. На его официальной странице написано:
BUGS:
It’s too big and too slow.
Я мог бы предложить альтернативный способ получения входной строки:
char c;
inputString = calloc(0,sizeof(char));
inputLength = 0;
c = getchar();
while(c!='\n')
{
inputString = realloc(inputString,(inputLength+1)*sizeof(char));
inputString[inputLength++] = c;
c = getchar();
}
inputString[inputLength] = '\0';
Теперь у вас есть строка в inputString и ее длина в inputLength. Вы могли бы очень хорошо сделать:
execlp(inputString,inputString,0);
для выполнения требуемой функциональности.