C实现一个 Shell 却登录失败
我自己写了一个Shell,发布到 /usr/local/bin/myshell,并修改 /etc/passwd 中的“登录Shell”字段,使其指向 /usr/local/bin/myshell,但是登录时出现问题。如果我在物理机上以多用户模式登录,则每次输入完密码后,就会让我重新输入用户名和密码。
如果使用 XShell 就能正常登录。
老哥们帮我看看,到底是哪出问题了。
程序代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <glob.h> #include <sys/types.h> #include <wait.h> #define DELIMS " \t\n" //虽然目前我们解析外部命令,只要一个glob_t就行了,但考虑到将来可能还要解析内部命令, //到时候还要附带额外信息,所以做成结构体,将所有用到的数据封装进去。 struct cmd_st { glob_t globres; }; static void prompt(void) { printf("mysh-0.1 $ "); } static void parse(char* line, struct cmd_st* cmd) { char* tok; int flag = 0; tok = strtok(line, DELIMS); while (1) { if (tok == NULL) break; /*!!! GLOB_APPEND * flag 操作,惊为天人 !!!*/ glob(tok, GLOB_NOCHECK | GLOB_APPEND * flag, NULL, &(cmd->globres)); flag = 1; tok = strtok(NULL, DELIMS); } } int main() { char* linebuf = NULL; size_t linebuf_size = 0; struct cmd_st cmd; pid_t pid; while (true) { prompt(); if (getline(&linebuf, &linebuf_size, stdin) < 0) break; parse(linebuf, &cmd); if (0) //内部命令 { /* Do Something */ } else //外部命令 { pid = fork(); if (pid < 0) { perror("fork()"); exit(1); } if (pid == 0) { execvp(cmd.globres.gl_pathv[0],cmd.globres.gl_pathv); perror("execvp()"); exit(1); } else { wait(NULL); } } } exit(0); }