Я пытаюсь реализовать базовую оболочку в C, но всякий раз, когда моя оболочка выполняет команду с помощью execvp(), она пропускает из цикла, я хочу, чтобы она осталась. Я подозреваю, что это потому что я не слишком хорошо знаком с execvp.execvp() не позволяет мне
Соответствующий код:
int main()
{
int nCmd = 1; // Command number
char *line; // Initial command line
token *list; // Linked list of tokens
CMD *cmd; // Parsed command
int process (CMD *);
for (; ;) {
printf ("(%d)$ ", nCmd); // Prompt for command
fflush (stdout);
if ((line = getLine (stdin)) == NULL) // Read line
break; // Break on end of file
list = lex (line);
// Lex line into tokens
free (line);
if (list == NULL) {
continue;
} else if (getenv ("DUMP_LIST")) { // Dump token list only if
dumpList (list); // environment variable set
printf ("\n");
}
cmd = parse (list); // Parsed command?
freeList (list);
if (cmd == NULL) {
continue;
} else if (getenv ("DUMP_TREE")) { // Dump command tree only if
dumpTree (cmd, 0); // environment variable set
printf ("\n");
}
process (cmd); // Execute command
freeCMD (cmd); // Free associated storage
nCmd++; // Adjust prompt
}
return EXIT_SUCCESS;
}
Вот соответствующие части «процесса»:
int process (CMD *cmdList)
{
if ((cmdList->nLocal)>0)
{
for (int i = 0; i<cmdList->nLocal; i++)
{
setenv(cmdList->locVar[i], cmdList->locVal[i], 0);
}
}
if (cmdList->type==SIMPLE)
{
execvp(cmdList->argv[0],cmdList->argv);
}
return 0;
}
Что происходит, что я получаю через первый процесс в основных годах для контура штрафа. Однако вместо чтения командной строки, как я хочу, после выполнения команды программа заканчивается. Как мне заставить его оставаться в цикле for?
'execvp()' заменяет текущую программу новой программой. Чтобы продолжить обработку в исходной программе оболочки, вам понадобится 'fork()' then 'execvp()' в дочернем элементе. –
Пожалуйста, ** RTFM ** здесь: http://man7.org/linux/man-pages/man3/exec.3.html (Первое предложение говорит все: "* Семейство функций exec() заменяет текущее образ процесса с новым образцом процесса. * ") – alk