Implement a hierarchical name space. In the basic file system, all files live in a single directory. Modify this to allow directory entries to point to files or to other directories.
Make sure that directories can expand beyond their original size just as any other file can.
The basic file system has a 14-character limit on file names. You may retain this limit for individual file name components, or may extend it, at your option. You must allow full path names to be much longer than 14 characters.
Maintain a separate current directory for each process. At startup, set the root as the initial process's current directory. When one process starts another with the fork system call, the child process inherits its parent's current directory. After that, the two processes' current directories are independent, so that either changing its own current directory has no effect on the other. (This is why, under Unix, the cd command is a shell built-in, not an external program.)
<aside> <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" width="40px" />
각 프로세스는 “현재 디렉터리”를 별도로 유지합니다. (프로세스가)시작할 때, 프로세스의 “현재 디렉터리” 초기값은 root 디렉터리로 설정하세요. 한 프로세스가 fork 시스템 콜로 다른 프로세스를 시작하게 하면, 그렇게 만들어진 자식 프로세스는 부모 프로세스의 “현재 디렉터리”를 상속 받습니다.
fork 이후에, 두 프로세스의 “현재 디렉터리”들은 서로 독립적이므로, 각 프로세스가 자신의 “현재 디렉터리”를 변경하는것은 다른 프로세스에게 영향을 미치지 않습니다. (이것이 바로 Unix에서의 cd
명령어가 외부 프로그램이 아닌 셸에 내장되어있는 이유입니다.)
</aside>
Update the existing system calls so that, anywhere a file name is provided by the caller, an absolute or relative path name may used. The directory separator character is forward slash ('/'). You must also support special file names '.' and '..', which have the same meanings as they do in Unix.
<aside>
<img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" width="40px" /> 기존의 시스템 콜을 수정해서, 호출자가 전달한 file name이 절대 또는 상대 경로인 이름을 사용할 수 있도록 하세요. 디렉터리를 구분하는 문자는 슬래시(’/
’) 입니다. 또한 여러분은 Unix에서와 동일한 의미의 특별한 파일 이름들인 ‘.
’ 과 ‘..
’ 도 지원해야 합니다.
</aside>
Update the
open
system call so that it can also open directories. Of the existing system calls, only close needs to accept a file descriptor for a directory.
<aside>
<img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" width="40px" /> open
시스템 콜이 디렉터리도 열 수 있도록 수정하세요. 기존 시스템 콜 중 디렉터리에 대한 파일 식별자(fd)를 알아야 할 필요가 있는것은 close 뿐입니다.
</aside>
Update the
remove
system call so that it can delete empty directories (other than the root) in addition to regular files. Directories may only be deleted if they do not contain any files or subdirectories (other than '.' and '..'). You may decide whether to allow deletion of a directory that is open by a process or in use as a processs current working directory. If it is allowed, then attempts to open files (including '.' and '..') or create new files in a deleted directory must be disallowed. Implement the following new system calls:
<aside>
<img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" width="40px" /> remove
시스템 콜이 일반 파일 외에 비어있는 디렉터리(root 제외)도 삭제할 수 있게 수정하세요.
디렉터리는 하위 파일 또는 하위 디렉터리(’.
’ 및 ‘..
’ 제외)를 포함하지 않는 경우에만 삭제할 수 있습니다. 프로세스가 열어둔 디렉터리나, 프로세스의 현재 작업 디렉터리를 삭제하는것을 허용할 것인지 여부는 여러분이 결정할 수 있습니다. 만약 허용하게된다면, 삭제된 디렉터리 안에서 파일(’.
’ 및 ‘..
’ 포함)을 열거나 새로운 파일을 만드는 시도는 허용되지 않아야 합니다. 다음과 같은 새로운 시스템 콜들을 구현하세요:
</aside>
bool chdir (const char *dir);
Changes the current working directory of the process to dir, which may be relative or absolute. Returns true if successful, false on failure.
<aside> <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" width="40px" />
</aside>
bool mkdir (const char *dir);
Creates the directory named dir, which may be relative or absolute. Returns true if successful, false on failure. Fails if dir already exists or if any directory name in dir, besides the last, does not already exist. That is, mkdir("/a/b/c") succeeds only if /a/b already exists and /a/b/c does not.
<aside>
<img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9a11588-e92f-471b-b46d-c1ae1a65b67f/짱구돌리기.gif" width="40px" /> 절대 또는 상대 경로인 디렉터리 dir
를 만듭니다. 성공했다면 true를, 그렇지 않으면 false를 반환합니다. 만약 dir
이 이미 존재하거나, 마지막 디렉터리 이외의 디렉터리 이름이 존재하지 않는 경우 실패합니다. 이 말은, mkdir(”a/b/c”) 는 /a/b 가 이미 존재하면서 /a/b/c 가 존재하지 않는 경우에만 성공한다는 뜻 입니다.
</aside>