落書きノート

ふと自分が気になった事を書いてます

C/C++ UNIX 標準入力からコマンドを読み実行する プロセス制御

#include "apue.h"
#include <sys/wait.h>

int main(void){
  char buf[MAXLINE];
  pid_t pid;
  int status;

  printf("%% ");
  while(fgets(buf, MAXLINE, stdin) != NULL){
    if(buf[strlen(buf) - 1] == '\n')
      buf[strlen(buf) - 1] = 0;

    if((pid = fork()) < 0){
      err_sys("fork error");
    } else if(pid == 0){
      execlp(buf, buf, (char *)0);
      err_ret("couldn't execute: %s", buf);
      exit(127);
    }

    if((pid = waitpid(pid, &status, 0)) < 0)
      err_sys("waitpid error");
    printf("%% ");
  }

  exit(0);
}

実行結果は以下のとおり。

> clang process_control.c -o process_control -I apue.3e/include -L apue.3e/lib -lapue
> ./process_control
% ls
apue.3e         ex-dir.c        stdin_to_stdout.c
display_process_id  process_control     stdin_to_stdout_2
display_process_id.c    process_control.c   stdin_to_stdout_2.c
ex-dir          stdin_to_stdout     test.txt
% who
hirotoshi console  Mar 23 14:50 
hirotoshi ttys000  Mar 23 21:12 
% date
2016年 3月23日 水曜日 22時45分19秒 JST
% pwd
/Users/hirotoshi/Documents/c-lang/unix

シェルを作成しているようなプログラムですね。