본문 바로가기

C

[시스템프로그래밍] who, cp, buffering

컴퓨터 메모리는 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와 같은 경로에 위치하며 시스템 로그인 및 로그아웃 관련 정보를 저장.

  1. 사용자 이름: 로그인한 사용자의 이름을 나타냅니다.
  2. 터미널 이름: 사용자가 로그인한 터미널 또는 로그아웃한 터미널의 이름을 나타냅니다.
  3. 로그인 시간: 사용자가 로그인한 시간을 기록합니다.
  4. 로그아웃 시간: 사용자가 로그아웃한 시간을 기록하며, 사용자가 로그아웃하지 않은 경우 비어 있을 수 있습니다.
  5. 호스트 또는 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 */