리눅스 system call 함수를 이용하여 ls, chmod, touch명령어의 일부 기능을 수행하는 myls, mychmod, mytouch 명령어를 직접 만들어보았다. 명령어의 옵션이 상당히 많기 때문에 일부의 옵션만 구현하였다. 모든 프로그램은 system()이라는 system call함수를 사용하지 않았다.

소스코드는 글 맨 아래에 링크를 달아두었다.

    우선 ls의 명령어는 굉장히 많기 때문에 일부옵션인 l, i, t, a옵션만 구현하였다. 모든 옵션은 동시에 가능하다 예를 들면 myls -lit <filename|pathname>과 같이 사용할 수 있다. 만약 매개변수가 경로명일 경우 해당 경로에 있는 모든 파일들을 보여주고 매개변수가 파일명일 경우 해당 파일에 대한 ls명령어 결과를 보여준다.

'l' 옵션을 준 경우 파일에 대한 자세한 사항을 보여준다.

'a' 옵션을 준 경우 '.'으로 시작하는 파일을 포함하여 디렉토리에 있는 숨겨진 파일 전부를 보여준다.

't' 옵션을 준 경우 경로에 있는 파일을 시간순으로 정렬하여 출력한다.

'i' 옵션을 준 경우 파일의 i-node 번호를 앞에 출력해준다.

아래는 실행 결과이다.

ls명령어와 같이 myls를 실행했을 때 현재 디렉토리의 모든 파일을 보여준다.
-l 옵션을 주어 실제 ls명령어와 결과 비교
-lit 옵션을 주었을 때 ls명령어와 결과 비교
-l 옵션을 주었을 경우 symbolic 디렉토리일 경우  실제로 가리키는 디렉토리가 -> 뒤에 나타난다.
setuid bit가 설정된 파일의 경우 x대신 s가 나타난다.

chmod 명령어는 숫자, 알파벳 모두 옵션으로 사용할 수 있도록 구현하였다. 따라서 다음과 같이 사용할 수 있다.

mychmod g+r <filename>

mychmod 644 <filename>

프로그램 내부에서는 chmod()라는 system call함수를 이용하여 파일의 접근권한을 수정한다. mychmod를 실행하기 전과 후에 ls명령어를 이용하여 파일 정보를 확인한다면 결과가 접근권한이 바뀌어있는 것을 확인할 수 있을 것이다.

아래는 실행 결과이다.

mychmod로 접근권한을 751로 바뀌게 했을 경우 실행 이전과 비교
뒤에 3자리 접근권한 앞에 1일 경우 stickybit를, 2일 경우 setgid bit, 4일 경우 setuid비트를 설정할 수 있다.
문자를 이용하여 접근권한을 바꿀 경우 결과이다.

    마지막으로 touch명령어는 굉장히 간단한 프로그램이다. 파일이 없을 경우 생성만 하면 되고 'c' 옵션의 경우 파일이 없을 경우 파일을 생성하지 않으면 된다. 만약 파일이 있을 경우 파일의 access, modify, change 시간을 현재 시간으로 갱신하기만 하면 된다. 이때 시간 변경은 utime()이라는 system call 함수를 이용하여 두 번째 인자로 NULL을 주어 자동적으로 현재 시간으로 수정하게 하면 된다. utime()함수는 access와 modify시간만 변경 가능하다. 따라서 현재 시간을 받아 그 시간 변수를 인자로 넘길 경우 각 줄을 실행하는 딜레이로 인해 change시간이 access와 modify의 시간과 다르게 갱신될 수 있다.

https://github.com/Seo-sang/LinuxSystemProgramming_ls_chmod_touch.git

 

Seo-sang/LinuxSystemProgramming_ls_chmod_touch

Contribute to Seo-sang/LinuxSystemProgramming_ls_chmod_touch development by creating an account on GitHub.

github.com

 

+ Recent posts