컴퓨터 메모리는 user space와 system space로 나뉘어있음.
다양한 프로그램이 user space에서 running됨
커널을 통해 프로그램들이 통신함.
모든 unix 명령어들은 다른 사람이 주로 C를 이용해 만든 프로그램임
새 명령어를 추가하고 싶으면 /bin, /usr/bin, /usr/local/bin 에서 구현
who command
: 어떤 유저가 서버에 접속했는지 출력해주는 명령어
logname, terminal, time, from where
utmp
utmp는 유닉스 및 유닉스 계열 운영 체제에서 사용되는 시스템 파일 또는 데이터베이스
이 파일은 현재 로그인한 사용자 및 시스템 관련 정보를 추적하는 데 사용
주로 /var/run/utmp 또는 /var/log/wtmp와 같은 경로에 위치하며 시스템 로그인 및 로그아웃 관련 정보를 저장.
- 사용자 이름: 로그인한 사용자의 이름을 나타냅니다.
- 터미널 이름: 사용자가 로그인한 터미널 또는 로그아웃한 터미널의 이름을 나타냅니다.
- 로그인 시간: 사용자가 로그인한 시간을 기록합니다.
- 로그아웃 시간: 사용자가 로그아웃한 시간을 기록하며, 사용자가 로그아웃하지 않은 경우 비어 있을 수 있습니다.
- 호스트 또는 IP 주소: 사용자가 로그인한 호스트나 IP 주소를 기록합니다.
utmp 파일은 시스템 관리 및 감사 트레일링(로그인 이력 추적)에 사용됨. 예를 들어, who 또는 w와 같은 명령어를 사용하여 현재 로그인한 사용자와 그들의 활동을 확인할 때 utmp 파일의 정보를 사용.
보안 감사 및 사용자 활동 추적에 중요한 역할.
작동원리
open utmp -> read record -> display record -> close utmp
<unistd.h>
- 파일 읽기
ssize_t numread = read(int fd, void *buf, size_t count);
fd = soruce of data
buf = 데이터 목적지
count = byte로 바꿀 수
<fcntl.h>
- 파일 열기 : process와 file을 연결
int fd = open(char *name, int how)
file descriptor(fd) : process -> kernel 터널 역할
- 파일 닫기
int res = close(int fd)
fd = file descriptor
cp command
cp source-file target-file
작동 원리
소스파일을 읽기 모드로 열기, 타겟파일을 쓰기 모드로 열기, read -> write, close
<fcntl.h>
- 파일 생성
int fd = creat(char *filename, mode_t mode)
<unistd.h>
- 파일 쓰기
ssize_t res = write(int fd, void *buf, size_t amt)
Buffering
buffer는 성능에 있어서 중요한 요소임.
system call을 최소화하기 위해서 buffer size를 늘려야함.
만약 cp1 프로그램이 data를 읽어야할 때 시간은 이렇게 소요됨.
1) data를 변환하는데 드는 시간
2) 커널에서 빼오는 시간
who를 구현할 때
read, open 함수를 냅다 쓰지 않고, 버퍼를 활용해서 코딩하면 더 좋은 성능을 보일 수 있음.
lseek()
파일의 커서를 조절하는 함수
lseek(fd, 0, SEEK_SET); /* Start of file */
lseek(fd, 0, SEEK_END); /* Next byte after the end of the file */
lseek(fd, -1, SEEK_END); /* Last byte of file */
lseek(fd, -10, SEEK_CUR); /* Ten bytes prior to current location */
lseek(fd, 10000, SEEK_END); /* 10001 bytes past last byte of file */
'C' 카테고리의 다른 글
[시스템프로그래밍] du 구현하기 (0) | 2023.10.17 |
---|---|
[시스템프로그래밍] ls, file과 directory (0) | 2023.10.12 |
[시스템프로그래밍] ssh, sftp, 커널과 셸 (2) | 2023.10.10 |
[시스템프로그래밍] 가상화, 리눅스, WSL2와 Ubuntu 차이 (0) | 2023.10.10 |
[자료구조] 불완전한 형식은 사용할 수 없습니다 오류 해결 | typedef (4) | 2023.05.17 |