gpt4 book ai didi

c - 用C语言制作shell

转载 作者:行者123 更新时间:2023-11-30 14:22:57 24 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

void exec(char **args){
pid_t pid;
int status;
if ((pid = fork()) < 0) {
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0) {
if(execvp(args[0],args)<0)//{
//printf("argv[0]=%s argv[1]=%s",args[0],args[1]);
printf("**error in exec\n");
}
else {
while (wait(&status) != pid);
}
}

void exec2(char **args, char *file){
printf("file =%s\n",file);
int fd;
pid_t pid;
int status;
if ((pid = fork()) < 0) {
printf("*** ERROR: forking child process failed\n");
exit(1);
}

else if (pid == 0) {
fd = open(file, O_RDWR | O_CREAT, (mode_t)0600);
close(1);
dup2(fd, 1);
if(execvp(args[0],args)<0){
printf("**error in exec");
}

else {
printf("\nhere\n");
close(fd);
while (wait(&status) != pid){
fflush(stdout) ;
}
}
}
close (fd);
}


void main(){
char *command;
char inp[512];
char *filepath;
size_t size=0;
char *substr;
char *args[512];
command = (char *) malloc(sizeof(char *) * 512);
int flag=0;
int redirect=0;
int i=0;
while (1){
printf("$ ");
command = fgets(inp, 512/*sizeof(char *)*/, stdin);

command[strlen(command)-1]='\0';

if (strchr(command,'>')){
redirect=1;
strtok_r(command,">",&filepath);
}

size_t siz=4;
//printf("command=%s\n",command);
int i=0;
while(1){
//printf("i=%d\n",i);
char *tok = strtok_r(command," ",&substr);
if (tok==NULL){
break;
}
args[i++] = tok;
/* printf("tok=%s\n",tok);
printf("len tok = %d\n",(int)strlen(tok));
printf("command=%s\n",command);
printf("substr=%s\n",substr);
*/ command = substr;
}

//printf("args[0]=%s",args[0]);
if (!strncasecmp(args[0],"exit",siz) || !strncasecmp(args[0],"quit",siz))
{
printf("\nBye\n");
exit(0);
}

else if(strcmp(args[0],"cd")==0){
chdir(args[1]);
//printf("chdir") ;
//system("pwd");
}

else if (redirect==1){
exec2(args,filepath);
}

else exec(args);
}
}

好的,这是我的 shell 代码。当我运行它时,我输入 ls 并给出正确的输出。然后我输入ls -l,然后再次输入ls,它给出:

ls:无法访问:没有这样的文件或目录

此外,当我使用cd时,ls不会给出输出,pwd说:

“忽略未使用的参数”

此外,cat 也不起作用。虽然 mkdirpsls -l 可以工作。

最佳答案

我在您的代码中发现了一些问题,首先您为 command 分配了超过 512 的空间,因为您使用了 sizeof(char*) 这很可能是 4:

command = (char *) malloc(sizeof(char*) * 512);

相反,请使用sizeof(char)you shouldn't cast the result of malloc它背后有一些逻辑,但这可能是一个偏好问题,我个人不这么认为:

command = malloc(sizeof(char) * 512);

其次,您没有正确使用strtok_r,第一次调用它时您传递了字符串,随后的时间,您传递了NULL,所以它应该是:

char *tok = strtok_r(command, " ", &substr);
while(tok){
args[i++] = tok;
tok = strtok_r(NULL, " ", &substr);
}

最后,这是主要问题,最后一个参数需要为NULL:

args[i] = 0;

关于c - 用C语言制作shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347092/

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