8
24
2010
0

unix 1-7

 

//============================================================================
// 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;
}
Category: unix | Tags: signal

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com