gpt4 book ai didi

c - 使用 unix 系统调用在 C 程序中实现类似 shell 的功能

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:20 37 4
gpt4 key购买 nike

有人可以建议这个程序有什么问题吗?我正在尝试通过在此处创建子进程来实现类似 shell 的功能。在给出具有单个单词的命令时,如 lspwd 它有效,但命令具有多个单词,如 ls -lrtwho am i 不工作。我正在犯一些愚蠢的错误,但无法调试。

    #include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <iostream>
#include <wait.h>
#include <errno.h>
#include <sys/types.h>
#include <cstdlib>
#define BUFSIZE 200
#define ARGVSIZE 40
#define DELIM "\n\t\r"

int main ()
{
int i,n;
char buf[BUFSIZE + 1] ;
char * str = "Shell > ";
char * clargs[ARGVSIZE] ;
int returnstatus;
for(;;)
{
n = 1;
write(STDOUT_FILENO,str,strlen(str));

read(STDIN_FILENO,buf,BUFSIZE);
if(!strcmp(buf,"exit\n"))
{
perror("exit");
exit(20);
}

clargs[0] = strtok(buf,DELIM);

while((clargs[n] = strtok(NULL,DELIM)) != NULL)
n++;

clargs[n] = NULL;

switch(fork())
{
case 0:
if((execvp(clargs[0],&clargs[0])) < 0)
exit(200);

default:
wait(&returnstatus);
printf("Exit status of command : %d\n",WEXITSTATUS(returnstatus));
for(int i =0; i <= n;i++)
clargs[i] = "\0";

for(int i =0; i < BUFSIZE+1;i++)
buf[i] = '\0';
}
}

return 0;

最佳答案

DELIM 中没有空格。
尝试运行 ls -lrt 时,您想运行 ls 可执行文件,带有两个参数 - ls-lrt.
但是您的 strtok 不会将 ls -lrt 一分为二。所以你实际上是在尝试运行一个名为 ls -lrt 的程序,但没有这样的程序。

DELIM 中添加一个空格应该可以解决它。

并不是说它在某些情况下不够好。例如。当运行 echo "a b" 时,你希望 "a b" 成为一个参数,因为有括号。 strtok 会将其分成两部分。真正的 shell 会进行更复杂的解析。

关于c - 使用 unix 系统调用在 C 程序中实现类似 shell 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759942/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com