スポンサード リンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサード リンク
-- : -- : -- | スポンサー広告 | page top↑
スポンサード リンク

UNIXシステムプログラミング-簡易シェルの実装

UNIXシステムコールを使い、簡単なシェルをC言語で実装してみました。現時点では以下の機能しか備えていませんが、今後機能を追加する予定です。

  1. 入力したコマンドを実行
  2. exitコマンドで終了

ソースコード

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

#define MAX_ARGS 10
#define MAX_LEN  100

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

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

  while (1) {
    /* プロンプトの表示 */
    ++n;
    printf("command[%d] ", n); 

    /* 1行読み込む */
    if (fgets(input, sizeof(input), stdin) == NULL) {
      /* EOF(Ctrl-D)が入力された */
      printf("Goodbye!\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("Goodbye!\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);
}

実行結果

****@ubuntu-vm:~/work/os$ gcc -Wall s_shell.c
****@ubuntu-vm:~/work/os$ ./a.out
command[1] ls
#ex01.c#  execlp0.c   fileio1.c~  fileio4.c~  s_shell.c
a.out     execve0.c   fileio2.c   foo         system0.c
ex1.c     execve0.c~  fileio2.c~  fork0.c     wait0.c
ex1.c~    fileio0.c   fileio3.c   fork0.c~    wait0.c~
ex2.c     fileio0.c~  fileio3.c~  hello.c
ex2.c~    fileio1.c   fileio4.c   httpget.c
command[2] cat hello.c
#include <stdio.h>
int main() {
  printf("hello, world!\n");
  return 0;
}
command[3] gcc -Wall hello.c
command[4] ./a.out
hello, world!
command[5] exit
Goodbye!
****@ubuntu-vm:~/work/os$ 

参考サイト

このプログラムは東工大のプログラミング第三(2007年度)という科目の講義資料とサンプルプログラムを参考にして作りました。

English Version

書籍

詳解UNIXプログラミング
詳解UNIXプログラミングW.リチャード スティーヴンス W.Richard Stevens 大木 敦雄

ピアソンエデュケーション 2000-12
売り上げランキング : 124773
おすすめ平均star


Amazonで詳しく見る
by G-Tools

スポンサード リンク

テーマ:UNIX/Linux - ジャンル:コンピュータ - ソーシャルブックマーク: この記事をクリップ! Yahoo!ブックマークに登録

00 : 40 : 02 | プログラミング-UNIX | トラックバック(0) | コメント(0) | page top↑
<<申し込みは本日(2/27)午後8時締め切り-基本情報技術者、初級シスアド | ホーム | Javaで学ぶデータ構造入門01-スタック(2/3)-ジェネリクスの実装>>
コメント

コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://networkprogramming.blog18.fc2.com/tb.php/22-0839c079
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |

プロフィール

TBVector

Author:TBVector

プロフィール

メールフォーム

記事検索

Google

最近の記事

人気の記事

過去の記事

カテゴリー

タグランキング

リンク

最近のコメント

最近のトラックバック

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。