Linux 는 C 언어 로 간단 한 셸 을 실현 합 니 다 (1)
처음에 선생님 께 서 한 시간 에 한 시간 씩 가 르 치 셨 기 때문에 그 당시 에 그 다음 에 입 출력 으로 방향 을 바 꾸 고 파이프 등 일련의 문 제 를 가 르 칠 줄 몰 랐 습 니 다. 제 취미 도 이런 부분 에 예습 을 하지 않 았 기 때문에 첫째, 코드 를 못 썼 습 니 다. 둘째, 코드 에 대해 합 리 적 인 계획 을 세우 지 않 았 고 복잡 하 게 썼 습 니 다.
코드 는 입 출력 으로 방향 을 바 꾸 고 파이프 처리 등 프로그램 을 추가 할 수 있 습 니 다.
이 코드 를 다시 쓰 라 고 하 시 면 더 잘 계획 하 실 것 같 아 요.
/*author:Samsons
date:2015.4.10*/
#include
#include
#include
#include <string.h>
#include
#include
#include
#define MAX(100)
#define LEN(100)
char *arglist[MAX]; //shell
int num; //shell
int execute(char* arglist[])//
{
int error;
error=execvp(arglist[0],arglist);
if (error==-1) printf("failed
");
exit(1);
}
char* make(char *buf)//
{
char *cp;
cp=malloc(strlen(buf)+1);
if (cp==NULL)
{
fprintf(stderr,"no memory
");
exit(1);
}
strcpy(cp,buf);
return cp;
}
int my_system(char *buf,char *arglist[])//
{
int num,j,i,last;
char buffer[LEN];
num=0;
i=0;
while (num<MAX)
{
if (buf[i]=='
')
{
arglist[num]=NULL;
return num;
}
if (buf[i]==' ') i++;
last=i;
while (buf[i]!=' ' && buf[i]!='
') i++;
for (j=last;jbuf[j];
buffer[j-last]='\0';
arglist[num++]=make(buffer);
}
}
int inner(char *arglist[])//
{
if (strcmp(arglist[0],"exit\0")==0)//exit
{
exit(0);
return 1;
}
else
if (strcmp(arglist[0],"pwd\0")==0)//pwd
{
char buf[LEN];
getcwd(buf,sizeof(buf));//
printf("Current dir is:%s
",buf);
return 1;
}
else
if (strcmp(arglist[0],"cd\0")==0)//cd
{
char buf[LEN];
if (chdir(arglist[1])>=0)
{
getcwd(buf,sizeof(buf));
printf("Current dir is:%s
",buf);
}
return 1;
}
else return 0;
}
void cat_in(char *q)//
{
char t[30];
int fd;
if (q[0]=='<')
{
strcpy(t,q+1);
fd=open(t,O_RDONLY);
arglist[1]=NULL;
if (fd==-1)
{
printf("file open failed
");
return;
}
dup(fd,0);
close(fd);
}
}
void cat_out(char *q)//
{
char t[30];
int fd;
if (q[0]=='>')
{
strcpy(t,q+1);
arglist[num-1]=NULL;
num--;
fd=open(t,O_CREAT|O_RDWR);
if (fd==-1)
{
printf("file open failed
");
return;
}
dup2(fd,1);
close(fd);
}
}
int main()
{
int i,pid;
char buf[LEN];
while (1)
{
fgets(buf,LEN,stdin);//
num=my_system(buf,arglist);//
int inner_flag;
inner_flag=inner(arglist);//
if (inner_flag==0)
{
pid=fork();//
if (pid==0)
{
if (arglist[1]!=NULL)
{
char q[LEN];
strcpy(q,arglist[1]);
cat_in(q);//
}
if (arglist[num-1]!=NULL)
{
char q[LEN];
strcpy(q,arglist[num-1]);
cat_out(q);//
}
execute(arglist);//
}
waitpid(pid,NULL,0);
}
}
return 0;
}
다음으로 전송:https://www.cnblogs.com/samsons/p/4417349.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.