読者です 読者をやめる 読者になる 読者になる

kitak.blog

Kみたいなエンジニアになりたいブログ

学校の課題「自分でシェルを作る」Part2

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

#define PROMPT ">"
#define MAX_ARGS 10
#define MAX_LEN  100

void child(int argc, char *argv[MAX_ARGS]);


int main()
{
  int argc;
  int status;
  char input[MAX_LEN], *argv[MAX_ARGS], *cp;
  const char *delim = " \t\n"; /* コマンドの区切り文字 */

  while (1) {
    /* プロンプトの表示 */
    printf(PROMPT); 

    /* 1行読み込む */
    if (fgets(input, sizeof(input), stdin) == NULL) {
      /* EOF(Ctrl-D)が入力された */
      printf("終了しました\n");
      exit(0);
    }

    /* 空白,タブ区切りでコマンド列に分割する */
    cp = input;
    for (argc = 0; argc < MAX_ARGS; argc++) {
      if ((argv[argc] = strtok(cp,delim)) == NULL)
        break;
      cp = NULL;
    }
    /* exitコマンドが入力されると終了 */
    if(strcmp(argv[0], "exit") == 0) {
      printf("終了しました\n");
      exit(0);
    }
    pid_t pid = fork();
    if(pid == -1) {
	/* fork()に失敗した */
      perror("fork");
      exit(1);
    } else if(pid == 0) {
	/* 子プロセス */
      child(argc, argv);
    } else {
	/* 親プロセス */
      wait(&status);
    }
  }
}

void child(int argc, char *argv[MAX_ARGS]) {
  execvp(argv[0], argv);
}