linux下实现简易shell

编写思路:

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;
}

猜你喜欢

转载自www.cnblogs.com/wangyubjhd/p/10280904.html