Linux C 프로 그래 밍 - 프로 세 스 소개 7 - 종합 응용 인 스 턴 스

4031 단어
첫 번 째 인 스 턴 스 는 fork 와 exec 시스템 함 수 를 중점적으로 설명 합 니 다.
이 인 스 턴 스 는 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!

좋은 웹페이지 즐겨찾기