在简单的 C shell 中输入 NULL 值后循环

Loop after input of NULL value in simple C shell

提问人:user1877442 提问时间:3/4/2014 最后编辑:albusshinuser1877442 更新时间:3/4/2014 访问量:341

问:

我正在尝试编写一个简单的 C shell。我的问题是我已经编写了程序,以便当用户输入 NULL 值时,我让 shell 退出并停止运行。然而,在使用不同的 shell 之后,我意识到 shell 继续循环。有没有办法在不重写代码的情况下解决这个问题?我对 C 还是个新手。

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

#define MAX_CMD_SIZE 512

 int getPath(){
        printf("PATH = %s\n", getenv("PATH"));
        return 0;
 }

 int setPath(char* arg){
        setenv("PATH", arg, 1);
        return 0;
 }

 int setwd() {
char *arg;
arg = getenv("HOME");
chdir(arg);
return 0;
}

int main()
{
        char buff[MAX_CMD_SIZE]; //buff used to hold commands the user will type in
        char *defaultPath = getenv("PATH");
        char *args[50] = {NULL};
        char *arg;
        int i;
        pid_t pid;

        setwd();
        while(1){
                printf(">");
                if (fgets(buff, MAX_CMD_SIZE, stdin) == NULL) { //Will exit if no value is typed on pressing enter
                        setPath(defaultPath);
                        getPath();
                        exit(0);
                } 

                arg = strtok(buff, " <|>\n\t");
                i = 0;
                if (arg == NULL) return -1;

                while (arg != NULL){
                        printf("%s\n", arg);
                        args[i] = arg;
                        arg = strtok(NULL, " <|>\n\t");
                        i++;
                }

                if (strcmp(args[0], "exit") == 0 && !feof(stdin)){ //Will exit if input is equal to "exit" or ctrl + d
                        setPath(defaultPath);
                        getPath();
                        exit(0);
                }

            else {
                    pid = fork();
                    if (pid < 0){ //Error checking
                            fprintf(stderr, "Fork Failed\n");
                    } else if (pid == 0){ //This is the child procsess
                            execvp(args[0], args);
                            exit(-1);
                    } else { //Parent Process
                        wait(NULL); // Parent will wait for child to complete
                    }
            }
        }
        return 0;
}
C Linux 外壳

评论


答: 暂无答案