编写思路:
0. 显示提示符$*
1. 标准输入读取命令
- 以空格为界分割字符串
- 对`cd`命令作特出处理*
- 处理信号`SIGINT(2)`、`SIGQUIT(3)`*
- 指定键入`exit`为退出shell命令*
2. fork子进程调用`execvp`
- `execvp(argv[0], argv)`,`argv`参数由步骤1生成
- 父进程使用`waitpid`处理返回信号*
标*暂未实现
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mysh.h"
void initShell()
{
while (1) {
prompt();
fflush(stdout);
fflush(stdin);
char buf[1024];
memset(buf, 0, sizeof(buf));
ssize_t size = read(0, buf, sizeof(buf) - 1);
if (size > 0) {
buf[size - 1] = '\0'; // del '\n'
}
char *argv[64] = {0};
parse(buf, argv);
int pid = fork();
if (pid == -1) {
perror("fork");
exit(-1);
}
if (pid == 0) {
execvp(argv[0], argv);
} else {
waitpid(-1, NULL, 0);
}
}
}
void prompt()
{
printf("begin type cmd: ");
}
void parse(char *buf, char *argv[])
{
char *p = buf;
int n = 0;
argv[n++] = p;
while (*p != '\0') {
if (*p == ' ') {
*p = '\0';
++p;
argv[n++] = p;
} else {
++p;
}
}
argv[n] = NULL;
}