#c
#c
Вопрос:
Я пытаюсь реализовать пользовательскую оболочку Unix, однако последняя передаваемая ей команда никогда не распознается. Когда я запускаю «ls», ничего не происходит, но если я выполняю «ls ls», это действует так, как будто был передан только один ls, или если я выполняю «ls -o», это выполняет только «ls», но если я выполняю «ls -o -o», это выполняет «ls -o», это должно функционировать аналогично стандартной оболочке Unix.
#include "apue.h"
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int parse(char* buf, char **cmds);
static void sig_int(int);
int
main(void)
{
char *path;
path = getenv("PATH");
char buf[MAXLINE];
char *envp[] = {path, NULL};
pid_t pid;
int status;
char *command[MAXLINE];
char *input;
if (signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal error");
printf("%% ");
while (fgets(buf, MAXLINE, stdin) != NULL) {
parse(buf, command);
if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) { /* child */
input = command[0];
execvpe(input, command, envp);
err_ret("couldn't execute: %s", buf);
exit(127);
}
/* parent */
if ((pid = waitpid(pid, amp;status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}
/*parses input into something runable*/
int parse(char* buf, char **cmds)
{
char *sep;
int count;
count = 0;
while((sep = strchr(buf, ' ')))
{
cmds[count]= buf;
*sep = '';
buf = sep 1;
count ;
while (*buf amp;amp; (*buf == ' ')) /* Ignore spaces */
buf ;
}
cmds[count] = NULL;
if(count == 0)
return 1;
return 0;
}
Комментарии:
1. Ваш код не компилируется без изменений (нам не хватает по крайней мере одного файла заголовка, а также нескольких функций (
err_sys
иerr_ret
). Также ваша функция синтаксического анализа не выполняет то, что вы ожидаете, когда в вашей команде нет места.2. После последнего аргумента нет пробела, поэтому
strchr
возвращаетсяNULL
, и он игнорируется.