기존의 무료 소프트웨어 쉘 (즉 sash
또는 bash)의 소스 코드 내부 모습과는
읽기 execvp(3) man 페이지 Advanced Linux Programming를 참조하십시오. execvp
이 실패 할 수 있습니다. 성공하면 은을 반환하지 않습니다! 또한 stdout(3)은 이고 버퍼는입니다. fflush(3)으로 전화해야합니다.
int main(void){
char line[1024];
char *args[16];
memset (args, 0, sizeof(args));
printf("$ ");
fflush(NULL);
fgets(line,sizeof(line),stdin);
args[0] = strtok(line, " ");
args[1] = strtok(NULL, " ");
printf("%s\n" , args[0]);
printf("%s", args[1]);
fflush(NULL);
execvp(args[0], args);
perror("execvp");
return EXIT_FAILURE;
}
을 관련 #include
지시를 잊지 마세요 :
당신은 아마 몇 가지 기본적인 이해를 누락 첫 번째 시도
을 (쉘이 forking 과정입니다 ... 또한 fork(2) & execve(2) 등 읽기) fflush(3), fgets
, execvp
, perror
이 필요합니다.
읽기 또한 errno(3), syscalls(2) ... gcc -Wall -g
를 사용
컴파일. 디버거 사용 방법 배우기 gdb
및 strace
참고 : 실제 쉘은 strtok(3)을 사용하지 않습니다. 그들은 선을 명시 적으로 구문 분석합니다 (쉘은 백 슬래시 또는 따옴표가있는 공백을 이스케이프 할 수 있기 때문에해야합니다).
실제로, 시도하십시오 strace ls
; /bin/ls
은 stat(2)입니다.
고급 Linux 프로그래밍에 대한 링크가 끊어졌습니다. – ajay
감사합니다. 수정되었습니다! –
감사합니다. 출력은 이제 "exevcp : bad address"가 무엇을 의미합니까? – tokenaizer