#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
int ArgumentAnalysis(char *pcCmdLine, char **ppcArgv);
void SigRoutine(int);
int main(int argc, char **argv)
{
char acCmdLine[1024];
int iArgc = 0;
char *apcArgv[62] = {0};
pid_t pid;
int iFd;
int iSaveFd;
int iRet;
signal(SIGINT, SigRoutine);
while(1)
{
printf("[myshell]#");
memset(acCmdLine, 0, sizeof(acCmdLine));
memset(apcArgv, 0 , sizeof(apcArgv));
gets(acCmdLine);
iArgc = ArgumentAnalysis(acCmdLine, apcArgv);
if(0 == iArgc)
{
continue;
}
// iFd = open("test.txt", O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IRWXO);
// if(iFd < 0)
// {
// return 1;
// }
// iSaveFd = dup(1);
// dup2(iFd, 1);
pid = fork();
switch(pid)
{
case -1:
{
printf("fork failed.\n");
break;
}
case 0:
{
iRet = execvp(apcArgv[0], apcArgv);
if(iRet < 0)
printf("not find command\n");
return 1;
}
default:
{
wait(NULL);
// dup2(iSaveFd, 1);
break;
}
}
}
return 0;
}
int ArgumentAnalysis(char *pcCmdLine, char **ppcArgv)
{
char *pcToken;
int iArgNum = 0;
char cStartFlag = 1;
if(NULL == pcCmdLine || NULL == ppcArgv)
{
return 0;
}
pcToken = pcCmdLine;
while(*pcToken != '\0')
{
if(' ' == *pcToken)
{
*pcToken = '\0';
cStartFlag = 1;
}
else
{
if(1 == cStartFlag)
{
ppcArgv[iArgNum] = pcToken;
iArgNum ++;
cStartFlag = 0;
}
else
{
pcToken ++;
continue;
}
}
pcToken ++;
}
return iArgNum;
}
void SigRoutine(int iSig)
{
signal(SIGINT, SIG_IGN);
return;
}
转载于:https://my.oschina.net/sharelinux/blog/115375