#2
apull2022-09-05 15:40
|
如果我在物理机上以多用户模式登录,则每次输入完密码后,就会让我重新输入用户名和密码。
如果使用 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);
}
#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);
}