1
실습으로 쉘을 만들고 있지만 문제가 있습니다. 거의 모든 명령은 "cd"를 제외하고는 잘 작동합니다. 왜 이런 일이 일어나는지 알 수 없습니다. 그것은 자식 프로세스의 작업 디렉토리를 변경하는 것 같다 부모 프로세스에 영향을 미치는되지 않으며, 따라서 그 효과는 쉘에서 만들었 었지되지C로 리눅스 쉘 구현하기
int main(int argk, char *argv[], char *envp[])
{
int frkRtnVal;
char *v[NV];
char *sep = " \t\n";
int i;
while (1)
{
fgets(line, NL, stdin);
fflush(stdin);
if (feof(stdin))
{
fprintf(stderr, "EOF pid %d feof %d ferror %d\n", getpid(), feof(stdin), ferror(stdin));
exit(0);
}
if (line[0] == '#' || line[0] == '\n' || line[0] == '\000')
{
continue;
}
v[0] = strtok(line, sep);
for (i = 1; i < NV; i++)
{
v[i] = strtok(NULL, sep);
if (v[i] == NULL)
{
break;
}
}
frkRtnVal = fork();
switch (frkRtnVal)
{
case -1:
{
break;
}
case 0:
{
execvp(v[0], v);
}
default:
{
wait(0);
break;
}
}
}
}
문제는'cd'를 포크하고 exec 할 수 없다는 것입니다; 이것은 쉘이'chdir()'시스템 호출 자체를 실행해야하기 때문에 내장 된 쉘입니다. (예를 들어, Mac OS X에서는'/ usr/bin/cd '가 있습니다.) 그러나 디렉토리를 변경 한 후 자식 쉘이 즉시 종료되기 때문에 아무 일도하지 않습니다. 어쨌든 주 쉘의 디렉토리를 바 꾸었습니다.) –
'cd'는 적어도 전통적인 의미에서는 프로그램이 아니기 때문에이 문제가 발생합니다. 'cd'는 쉘 내장 명령입니다 (자세한 내용은'man builtin' 또는'man cd'를 입력하십시오). 이는'cd '와 다른 쉘 내장 로직이 쉘 프로그램에 내장된다는 것을 의미하며, 이는 포크에 의해 호출되고 포킹과 실행의 전통적인 프로세스를 통해 쉘에 의해 호출되는 외부 프로그램이되는 것을 의미합니다. 이것은'/ bin'에'cd' 프로그램이 없다는 것을 보아서 확인할 수 있습니다. – user3282276
(초기 복제본은 충분히주의 깊게 읽지 않았으며 디렉토리 이름의 일부로 줄 바꾸기 문제가 발생 했음에도 불구하고 이에 대한 적절한 복제본이 하나 이상 있습니다.) –