C 接受多字命令的基本shell

C 接受多字命令的基本shell,c,linux,shell,C,Linux,Shell,我试图实现一个接受命令的shell;然而,我不能让它正常工作。例如,如果我键入“ls-a”,我会得到以下结果: 无效选项--' " 有关详细信息,请尝试“ls--help” 我可能犯了一些严重的错误,因为我是初学者,所以请原谅我。另外,我将把在命令中读取的代码放入函数中。这就像测试一样-谢谢 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h>

我试图实现一个接受命令的shell;然而,我不能让它正常工作。例如,如果我键入“ls-a”,我会得到以下结果:

无效选项--' "

有关详细信息,请尝试“ls--help”

我可能犯了一些严重的错误,因为我是初学者,所以请原谅我。另外,我将把在命令中读取的代码放入函数中。这就像测试一样-谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stddef.h>

int main()
{
    pid_t       pid;
    int         status;
    char* token;
    char* argv[20];
    char input[100];

    printf("AP> ");

    while (1)
    {
        fgets(input, 100, stdin);
        token = strtok(input, " ");

        int i = 0;
        //walk through other tokens
        while (token != NULL) {
            argv[i] = malloc(strlen(token) + 1);
            strncpy(argv[i], token, strlen(token));
            //argv[i] = token;
            i++;
            token = strtok(NULL, " ");
        }
        argv[i] = NULL; //argv ends with NULL

        pid = fork();

        if (pid < 0)
        {
            perror("fork error");
            return EXIT_FAILURE;
        }

        else if (pid == 0)
        {
            // child process
            execvp(argv[0], argv);
            perror("execl error");
            return EXIT_FAILURE;
        }

        else {
            // parent process
            if (waitpid(pid, &status, 0)<0)
            {
                perror("waitpid error");
                return EXIT_FAILURE;
            }
        }
        printf("AP> ");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
pid_t pid;
智力状态;
字符*令牌;
char*argv[20];
字符输入[100];
printf(“AP>”);
而(1)
{
fgets(输入,100,标准输入);
令牌=strtok(输入“”);
int i=0;
//浏览其他代币
while(令牌!=NULL){
argv[i]=malloc(strlen(令牌)+1);
strncpy(argv[i],token,strlen(token));
//argv[i]=令牌;
i++;
令牌=strtok(空,“”);
}
argv[i]=NULL;//argv以NULL结尾
pid=fork();
if(pid<0)
{
perror(“分叉错误”);
返回退出失败;
}
否则如果(pid==0)
{
//子进程
execvp(argv[0],argv);
perror(“执行错误”);
返回退出失败;
}
否则{
//父进程

if(waitpid(pid,&status,0)如果在内部while循环之后插入以下循环,那么您将看到在while循环开始之前没有删除
input
末尾的换行符

for (i=0; argv[i]; i++)
   printf("argv[%d] = '%s'\n", i, argv[i]);
或者,您可以使用:

" \n"
作为您的分隔符,而不仅仅是

" "