Linux C 프로 그래 밍 - 프로 세 스 소개 7 - 종합 응용 인 스 턴 스
이 인 스 턴 스 는 Linux 시스템 표준 Shell 의 작은 기능 을 수행 할 수 있 는 대화 형 명령 처리 프로그램 입 니 다. 구체 적 인 기능 은 다음 과 같 습 니 다.
1. 명령 을 제출 하 는 인 자 는 최대 8 개 입 니 다.
2. 전, 백 스테이지 실행 가능
3. 한 명령 줄 에 여러 명령 을 동시에 가 질 수 있 고 서로 분점 으로 구분 할 수 있다.
실현 프로그램의 주 류 는 다음 과 같다.
for(;;)
{
output("mini_SH-->");
readcmd();
docommand();
}
다음은 소스 코드 를 드 립 니 다.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#define MAXARG 10
#define LINSIZ 80
#define CMDSIZ 8
extern char **environ;
char *quit="quit.quit";
char cmdbuf[CMDSIZ][LINSIZ];
int cmdflag[CMDSIZ];
int main()
{
int i;
for( ; ;)
{
printf("mini_SH-->");
for(i=7;i>=0;i--)
{
cmdflag[i]=0; /* */
cmdbuf[i][0]='\0';
}
if(i=readcmd()) /* */
docommand(i); /* */
else
printf("read command failed, try again!!!
");
}
}
readcmd()
{
char c,*p;
int i=0;
p=cmdbuf[0];
while((c=getchar())!='
')
{
if(c==';')
{
*p='\0';
if(++i==6)
return(++i);
p=cmdbuf[i];
}
else if(c=='&')
{
cmdflag[i]=1;
}
else
*p++=c;
}
*p='\0';
return(++i);
}
docommand(int i)
{
int j, stat, pid;
char *argl[MAXARG], args[LINSIZ];
char c, *argsp, **arglp, *p;
for(j=0;j<i;j++)
{
arglp=argl;
argsp=args;
p=cmdbuf[j];
while((c=*p++)!='\0')
{
while(c==' '|| c=='\t')
c=*p++;
if(c=='\0')
{
*argsp++='\0';
break;
}
*arglp++=argsp;
while(c!=' '&&c!='\t'&&c!='\0')
{
*argsp++=c;
c=*p;
if(c) p++;
}
*argsp++='\0';
}
*arglp=(char *)0;
if(strcmp(argl[0],quit)==0)
{
printf("Bye Bye!
");
exit(0);
}
if((pid=fork())==0)
{
if(cmdflag[j]) setpgrp();
execve(argl[0],argl,environ);
printf("Returned from execve: %s
",cmdbuf[i]);
exit(10);
}
else
{
if(! cmdflag[j])
while(wait(&stat)!=pid);
}
}
}
프로그램 코드 설명:
(1) 데이터 구조 설명.이 미니SH 는 명령 마다 사용 할 수 있 는 최대 매개 변수 개 수 를 MAXARG 로 정의 하고 10 으로 정의 합 니 다.각 명령 의 문자 캐 시 배열 은 LINSIZ 에 의 해 결정 되 며, 최대 80 이 며, 한 번 에 제출 하 는 명령 개 수 는 CMDSIZ 에 의 해 결정 되 며, 최대 8 개 입 니 다.문자 포인터 quit 는 종료 명령 문자열 을 저장 합 니 다. quit. quit, 2 차원 배열 cmdbuf 는 표준 입력 으로 읽 은 문자열 을 저장 하고 배열 cmdflag 는 이 명령 을 어떤 방식 으로 실행 할 지 결정 합 니 다. 0 은 프론트 이 고 1 은 백 스테이지 입 니 다.
(2) main 함수.메 인 프로 세 스 의 디자인 사상 에 따라 무한 순환 for 에서 먼저 인쇄 명령 수신 프롬프트 miniSH --> 사용자 가 입력 한 명령 문자열 을 함수 readcmd 를 통 해 cmdbuf 2 차원 배열 에 저장 하고 readcmd 는 제출 한 분점 으로 분 리 된 명령 개 수 를 되 돌려 줍 니 다.함수 docommand 는 cmdbuf 에 저 장 된 명령 을 실행 합 니 다.
(3) readcmd 함수.사용 자 를 표준 입력 에서 제출 한 명령 을 구분 번호 에 따라 각각 명령 버퍼 cmdbuf 에 저장 합 니 다. 명령 문자 에 '&' 문자 가 있 으 면 명령 표지 배열 cmdflag 의 해당 위 치 를 1 로 표시 합 니 다. 명령 을 제출 할 때마다 이 배열 필드 는 0 으로 정리 되 고 제출 한 명령 개 수 를 되 돌려 줍 니 다.
(4) docommand 함수.for 순환 에서 매번 명령 을 실행 합 니 다.사용자 가 제출 한 명령 은 배열 cmdbuf 에 순서대로 저 장 됩 니 다. while 순환 은 명령 이 실 행 된 매개 변 수 를 빈 칸 이나 탭 문 자 를 경계선 으로 하고 문자 형의 포인터 배열 argl 을 각각 해당 문자열 을 가리 키 며 argl [0] 은 이 명령 문자열 을 가리 키 며 arg [1] 은 이 명령 의 첫 번 째 매개 변수 입 니 다. 이 를 유추 하여 마지막 매개 변 수 는 빈 지침 입 니 다.매개 변수 에 빈 문 자 를 추가 합 니 다\0"명령 문자열 이 정 의 된 이 명령 문자열 quit. quit 를 종료 하려 면 exit 시스템 함수 로 실행 을 종료 합 니 다. 그렇지 않 으 면 fork 로 하위 프로 세 스 를 생 성 합 니 다. 배경 플래그 위 치 를 설정 하면 프로 세 스 그룹 번 호 를 다시 설정 하고 환경 변 수 를 가 진 시스템 으로 execve 를 호출 하여 사용자 가 제출 한 명령 을 실행 합 니 다. 이 명령 이 나중에 실행 되면 부모 프로 세 스 가 실행 되 지 않 습 니 다.이 명령 이 실 행 될 때 까지 기다 리 면 새 명령 을 실행 할 수 있 습 니 다. 그렇지 않 으 면 부모 프로 세 스 는 wait 함 수 를 사용 하여 하위 프로 세 스 가 일시 정지 되 거나 종 료 될 때 까지 기 다 립 니 다.
이 프로그램 은 완전한 프로그램 입 니 다. 컴 파일 한 후에 mini sh 명령 을 생 성 합 니 다. 다음은 mini sh 명령 제어 하에 사용자 가 명령 을 제출 하 는 실행 상황 입 니 다.
$ ./mini_sh
mini_SH-->/bin/date
2011 년 12 월 05 일 월요일 23: 37: 19 PST
mini_SH-->/bin/who
Returned from execve:
mini_SH-->/bin/pwd;/bin/date
/home/lxy/test1/BruceZhang
2011 년 12 월 05 일 월요일 23: 37: 19 PST
mini_SH-->quit.quit
Bye Bye!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.