//============================================================================ // Name : unix.cpp // Author : xiaoguozi // Version : // Copyright : Your copyright notice // Description : read command from stdin to exec,Ansi-style //============================================================================ #include "apue.h" #include <dirent.h> #include <iostream> #include <sstream> #include <vector> #include <sys/wait.h> using namespace std; #define BUFSIZE 4096 static void sig_int(int){ printf("interrupt\n"); } int main(int argc,char *argv[]) { string cmd; pid_t pid; int status; if(::signal(SIGINT,sig_int) == SIG_ERR) err_sys("signal error"); while(getline(cin,cmd)){ stringstream ios; ios<<cmd; string tmp; vector<string> vec; while(ios>>tmp){ vec.push_back(tmp); } if(vec.size()>4){ err_sys("arguments must less than 4"); //continue; } if((pid=fork())<0){ err_sys("fork error"); }else if(pid==0){ if(vec.size()==1) execlp(vec[0].c_str(),vec[0].c_str(),(char*)0); else if(vec.size()==2) ::execlp(vec[0].c_str(),vec[0].c_str(),vec[1].c_str(),(char*)0); else if(vec.size()==3) ::execlp(vec[0].c_str(),vec[0].c_str(),vec[1].c_str(),vec[2].c_str(),(char*)0); else if(vec.size()==4) ::execlp(vec[0].c_str(),vec[0].c_str(),vec[1].c_str(),vec[2].c_str(),vec[3].c_str(),(char*)0); exit(127); } if((pid=::waitpid(pid,&status,0))<0){ err_sys("wait error"); } cout<<"% "<<pid<<endl; } return 0; }