c - 可能出了什么问题, ls 在我自己的 shell 上不起作用

标签 c linux shell

我必须编写自己的 shell,它几乎已完成,但我在 ls/pwd 方面遇到问题

ls 给我这个错误:无法访问'':没有这样的文件或目录

pwd 正在以某种方式工作,但它仍然给我错误:忽略非选项参数

/image/3IpRd.png 可能是什么问题?

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
void  parsowanie(char *line, char **argv)
{
    while (*line != '\0') {
        while (*line == ' ' || *line == '\n'|| *line == '\t' )

            *line++ = '\0';
            *argv++ = line;

        while (*line != '\0' && *line!= ' ' && *line != '\t' && *line != '\n')
            line++;
    }
    *argv = '\0';
}
int main()
{

    printf("MicroShell\nAutor:Amadeusz Lewandowski\n");
    char co_chcesz[500],cwd[500],login[50],*argv[1000],*to;
    memset(argv,0,999);
    pid_t pid;
    int status;
    while(strcmp(co_chcesz,"exit\n"))
        {
        sleep(1);
        getcwd(cwd,sizeof(cwd));
        getlogin_r(login,sizeof(login));
        printf("[%s:%s]\n$ ",login,cwd);
        fgets(co_chcesz,1000,stdin);
        if (strcmp(co_chcesz,"help\n")==0)
            {
            printf("autor to miranda orange\n");
            continue;
            }
        pid=fork();

        if(pid==0)
        {
            if (execvp(*argv,argv)<0)
            {
                perror("The following error occurred");
                printf("Value of errno:%d\n",errno);
                    break;
            }
            else
            {
            waitpid(pid,&status,0);
            }
        }
    }
    return 0;
}

最佳答案

你的命令行分割函数是错误的。此处重新格式化以更好地展示其实现方式:

void  parsowanie(char *line, char **argv)
{
    while (*line != '\0') {
        /* Eating whitespace */
        while (*line == ' ' || *line == '\n'|| *line == '\t' )
            *line++ = '\0';

        /* Adding next command line argument to `argv` */
        *argv++ = line;

        while (*line != '\0' && *line!= ' ' && *line != '\t' && *line != '\n')
            line++;
    }
    *argv = '\0';
}

问题是您将下一个命令行参数添加到 argv在您真正知道是否有下一个命令行参数之前。所以我们要在*argv++ = line;之前添加一个测试。测试在while现在声明变得不必要了。

void  parsowanie(char *line, char **argv)
{
    while (1) {
        /* Eating whitespace */
        while (*line == ' ' || *line == '\n'|| *line == '\t' )
            *line++ = '\0';

        /* Checking if there are more command line arguments */
        if (!*line)
          {
            /* Terminating `argv` */
            *argv = NULL;
            return;
          }

        /* Adding next command line argument to `argv` */
        *argv++ = line;

        while (*line != '\0' && *line!= ' ' && *line != '\t' && *line != '\n')
            line++;
    }
}

关于c - 可能出了什么问题, ls 在我自己的 shell 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59804553/

相关文章:

整数数组的 C While 循环

linux - 从一个 Docker 容器连接到另一个 Docker 容器的端口

java - 在UBuntu 中构建Android Demo 时出错

c++ - 程序接收信号 SIGSEGV,段错误

linux - 如何根据字符代码或 ASCII 码值对文本文件进行排序?

c - 我的 counter3 如何正确递增循环?

c - 脚本和主机应用程序之间的责任

c++ - 拾色轮

Bash 依赖变量

linux - 如何运行 MPI 任务?