치춘짱베리굿나이스

[Rank 3] Minishell - 사용가능 함수 정리 본문

42/42s Cursus

[Rank 3] Minishell - 사용가능 함수 정리

치춘 2022. 2. 3. 18:01

무지많다 (화이팅


tc로 시작하는 일련의 함수들과 tty가 들어간 함수들은 Termcap 구현 시에 사용하는 함수들로, Mandatory에서는 필요가 없었다

아마도.. 일단 내가 맡은 파트에선 안썼다


unistd.h

unlink

int unlink(const char *path);
  • path에 해당하는 파일 링크를 삭제한다 (= 파일을 지운다)
    • 정확하게는 hard link가 참조하는 count를 1 감소시키며, 이 count가 0이 되면 실제 파일 내용이 저장되어 있는 disk space를 free하여 다른 파일이 저장될 수 있도록 한다
    • 따라서 hard link가 없는 일반 파일들은 그냥 지워지는 것
  • 성공했을 경우 0을 반환하며, 실패했을 경우 -1을 반환하고 errno에 에러를 설정한다

close

int close(int fildes);
  • 지정된 파일 디스크립터에 해당하는 파일 닫기
  • 정상적으로 파일을 닫았을 경우 0을 반환하며, 실패했을 경우 -1을 반환하고 errno에 에러를 설정한다

read

ssize_t read(int fildes, void *buf, size_t nbyte);
  • 인자로 받은 파일 디스크립터 fildes로부터 nbyte만큼 값을 읽어 buf에 넣는다
  • 파일을 정상적으로 읽었을 경우 읽은 바이트 수를 반환하고, EOF를 읽었을 경우 0을 반환하며 파일 읽기에 실패했을 경우 -1을 반환하고 errno에 에러를 설정한다

write

ssize_t write(int fildes, const void *buf, size_t nbyte);
  • fildes 인자에 지정된 파일 디스크립터에 해당하는 파일에 nbyte 만큼의 값을 쓴다
  • 만약 fildes가 1일 경우 표준 출력이므로 쉘에 출력된다

fork

pid_t fork(void);
  • 프로세스를 생성한다
  • fork 함수를 호출하는 프로세스는 부모 프로세스가 된다
  • fork 함수를 통해 생성되는 프로세스는 자식 프로세스가 된다
  • fork 함수 호출 이후 코드부터는 부모 프로세스와 자식 프로세스가 각자의 메모리를 사용하여 실행된다
    • 자식 프로세스는 부모 프로세스와 동일한 주소 공간의 복사본을 사용하게 되므로, fork 함수 실행 이후 부모와 자식 프로세스는 동일한 코드를 각자 메모리상에서 실행하게 됨
  • 성공적으로 포크에 성공했을 경우 자식 프로세스에 0, 부모 프로세스에 자식 프로세스의 pid를 반환하며, 실패했을 경우 부모 프로세스에 -1을 반환하고 자식 프로세스는 생성되지 않는다

pipe

int pipe(int fildes[2]);
  • 파이프를 생성하고, 두 파일 디스크립터 (인자로 들어온 int 배열 fildes 안에 들은 두개의 디스크립터) 를 파이프로 잇는다
  • pipe 함수 호출이 성공했을 경우 fildes[2] 에 각각의 파일 디스크립터가 담긴다
  • 배열 fildes의 앞 디스크립터가 read end, 뒤 디스크립터가 write end
  • 이 말인즉슨 fildes[0]은 데이터를 입력 받을 수 있는 파일 디스크립터가 담기며 (파이프의 출구) fildes[1]은 데이터를 출력할 수 있는 파일 디스크립터가 담긴다 (파이프의 입구)
  • 이를 이용하여 fork()를 이용해 만든 부모↔자식 프로세스간 데이터를 교환할 수 있다
  • 정상적으로 파이프가 생성될 경우, 0을 반환한다. 그 외의 경우, -1이 반환되며 errno에 에러를 설정한다.

dup

int dup(int fildes);
  • 파일 디스크립터 fildes를 복제한다
    • 새로운 파일 디스크립터를 반환하지만, 숫자만 다를 뿐 원래의 서술자 fildes와 완벽하게 같은 파일을 가리킨다
    • 따라서 원본 fildes나, 반환된 디스크립터나 둘 다 write를 사용하면 같은 파일에 내용이 적히게 된다 (디스크립터만 다를 뿐)
  • 복제에 성공하면 복제된 새로운 파일 디스크립터 (할당 가능한 가장 작은 디스크립터) 를, 실패하면 -1을 반환한다

dup2

int dup2(int fildes, int fildes2);
  • fildes2fildes1로 바꾼다 (우회한다?)
    • dup2가 호출된 다음부터, fildes2 디스크립터를 사용하면 fildes1이 가리키는 파일을 다루게 된다
    • 만약 fildes2 디스크립터가 가리키는 파일이 이미 열려있을 경우, 그 파일을 닫고 fildes1의 파일을 fildes2도 가리키게 한다
    • 바뀐 파일 디스크립터는 프로세스 상에서만 유지되므로 (자식 프로세스에서 dup2를 사용했다면 자식 프로세스가 종료되었을 때 부모 프로세스에선 원래대로 돌아온다) 걱정하지 말것
  • 복제에 성공하면 fildes2를, 실패하면 -1을 반환한다

execve

int execve(const char *path, char *const argv[], char *const envp[]);
  • 현재 프로세스는 종료되고, *path에 저장된 실행 파일 또는 명령어가 실행된다
    • *path는 교체할 실행 파일 또는 명령어가 들어가며, 실행가능한 binary 파일이거나 쉘 스크립트여야 하며, 정확한 절대경로 / 상대경로로 지정되어야 함
    • argv*path에 해당하는 실행파일에 넘겨줄 인자로, argc가 없는 대신 argv 배열의 끝에 NULL값이 들어간다
    • envpkey=value 형식의 환경변수 문자열 배열로, 마지막 값은 NULL이다
    • 시스템 환경변수를 사용하려면 environ 전역변수 사용 (C 프로그램에는 environ이라는 전역 변수가 미리 만들어져 있으며, 이를 통해 환경변수 목록을 확인할 수 있다, 다른 곳에 선언되어 있으므로 extern 문으로 environ 변수를 참조하여 목록을 확인하면 된다)
  • 현재 실행되는 프로그램의 기능 (현재 프로세스) 은 전부 종료되고, *path에 해당하는 프로그램을 메모리에 적재하여 처음부터 실행한다. PID는 그대로
  • 정상적으로 execve가 실행되면 프로세스가 변화하므로 반환값을 받을 수 없고, 실패하면 -1을 반환한다

getcwd

char * getcwd(char *buf, size_t size);
  • 현재 작업 디렉토리의 절대경로를 buf 포인터에 담고, 문자열로 반환한다
  • size는 버퍼의 사이즈
  • buf, size 조건
    • buf가 넉넉히 malloc되어 있고, size도 넉넉할 때 → 정상 출력 (buf 주소 반환)
    • buf는 넉넉히 malloc되어 있으나, size가 넉넉치 않을 때 → ERANGE
    • buf 공간이 넉넉치 않은데 size를 무리하게 크게 줄 때 → 힙 오버플로우
    • buf 공간도 넉넉치 않고 size도 적을 때 → ERANGE
    • buf가 널포인터일 때 → getcwd가 자체적으로 메모리 할당하여 값 반환
    • 반환값은 경로 문자열이 담긴 메모리 포인터 주소
      • buf 공간이 넉넉했다면 buf 포인터 재반환, 그 외에는 getcwd가 할당한 메모리 반환chdir

chdir

int chdir(const char *path);
  • 현재 작업 디렉토리를 path 디렉토리로 바꾼다
    • 디렉토리 변경을 위해서는 프로세스가 디렉토리에 대한 권한을 가지고 있어야 함
  • 정상적으로 동작했다면 0을 반환하고, 에러 발생 시에 -1을 리턴
    • path에 해당하는 디렉토리가 존재하지 않을 때, 심볼릭 링크가 너무 많아서 루프를 돌 때, path에 해당하는 디렉토리 이름이 너무 길 때 등isatty

isatty

int isatty(int fd);
  • 파일 디스크립터 fd가 터미널에 연결되어 있는지 여부를 반환한다
  • fd가 터미널에 연결되어 있다면 1을, 아니면 0을 반환

ttyname

char * ttyname(int fd);
  • isatty(fd) 가 1 (참) 이라면, 연결된 디바이스 이름을 반환한다
  • isatty(fd) 가 0이라면 널포인터를 반환한다

ttyslot

int ttyslot(void);
  • 현재 프로세스의 제어 단말 (디바이스) 번호를 반환한다
  • 제어 단말이 발견되지 않을 경우 0을 반환한다

fcntl.h

open

  int open(const char *path, int oflag, ...);
  • path에 해당하는 파일을 연다
  • oflag에는 파일을 여는 방식을 지정할 수 있다
    • O_RDONLY : 읽기 전용
    • O_WRONLY : 쓰기 전용
    • O_RDWR : 읽기와 쓰기 둘 다
    • 추가 플래그:
    • O_NONBLOCK :
    • O_APPEND : 매 write 마다 덮어씌우지 않고 내용 추가 (append)
    • O_CREAT : 파일이 존재하지 않을 경우 생성
    • O_TRUNC : 크기를 0으로 자르기 (truncate)
    • O_EXCL : O_CREAT 플래그를 사용한 상태에서 파일이 존재할 경우 에러 출력
    • O_SHLOCK : 원자적으로 (atomically) shared lock 취득
    • O_EXLOCK : 원자적으로 (atomically) exclusive lock 취득
    • O_NOFOLLOW : symlink 따르지 않기
    • O_SYMLINK : symlink를 통해 열기 가능
    • O_EVTONLY : 특정 이벤트에서만 파일 디스크립터 리퀘스트
    • O_CLOEXEC : close-on-exec으로 마크
    • O_NOFOLLOW_ANY : 모든 경로에서 symlink 따르지 않기
  • 정상적으로 파일을 열었다면 파일 디스크립터를 반환하고, 실패했을 경우 -1을 반환하며 errno에 에러를 설정한다

stdlib.h

malloc

  void *malloc(size_t size);
  • 힙 메모리 영역에 size 만큼의 메모리를 할당하고, 그 주소를 반환한다
  • 할당받은 메모리는 사용자가 알아서 적절히 해제해 줘야 한다 (free 등 함수 사용해서..)

free

void free(void *ptr);
  • malloc, calloc, realloc 등으로 할당받은 메모리 영역을 해제한다

exit

void exit(int status);
  • 프로세스를 종료한다
  • 종료하기 전에 다음과 같은 기능을 수행한다
    • atexit(3) 함수에 명시된 함수들을 실행하며, 실행 순서는 atexit(3) 에 저장된 순서와 반대
    • 모든 열려있는 출력 스트림을 Flush
    • 모든 열려있는 출력 스트림 닫기
    • tmpfile(3) 함수에 의해 생성된 파일들 모두 언링크 (삭제)
  • 실행 후 프로세스가 그냥 종료되므로 반환 값은 없다

getenv

char *getenv(const char *name);
  • name이라는 이름의 환경변수를 가져온다
  • 성공적으로 변수를 가져왔다면 변수의 값을 문자열 형식으로 반환하고, 현재 환경에 name이라는 이름의 환경변수가 존재하지 않다면 NULL 포인터를 반환한다

sys/wait.h

wait

pid_t wait(int *stat_loc);
  • 부모 프로세스가 fork() 함수를 사용하여 자식 프로세스를 생성하였을 때, 부모 프로세스가 자식 프로세스의 종료 상태를 얻기 위해서 사용하는 함수
  • wait() 함수를 사용하여 부모 프로세스가 자식 프로세스 종료까지 기다릴 수 있다 (원래는 동시에 돈다)
    • 자식 프로세스가 동작 중이면 부모 프로세스는 대기
    • 자식 프로세스가 종료되면 wait 함수가 시그널을 받으며 호출 종료되고, 값 반환
    • 자식 프로세스가 없다면 오류로 -1 반환
  • 자식 프로세스가 종료되면 자식 프로세스의 pid를 반환하고, 자식 프로세스가 존재하지 않을 때 -1이 반환되며 두 경우 모두 stat_loc 변수에 자식 프로세스가 반환한 exit 값 또는 에러 코드가 저장됨

waitpid

pid_t waitpid(pid_t pid, int *stat_loc, int options);
  • wait 함수와 거의 사용법이 비슷하나, 부모 프로세스의 대기 여부 등 상세한 옵션을 지정할 수 있으며 pid를 지정하여 특정 자식 프로세스를 가리킬 수 있다
  • pid 매개변수의 경우의 수
    • pid가 -1일 겅우 임의의 자식 프로세스를 기다림
    • pid가 0보다 클 경우 프로세스 ID가 pid인 자식 프로세스를 기다림
    • pid가 -1보다 작을 경우 프로세스 그룹 ID가 pid의 절댓값과 같은 자식 프로세스를 기다림
    • pid가 0일 경우 waitpid를 호출한 프로세스의 프로세스 그룹 PID와 같은 프로세스 그룹 ID를 가진 프로세스를 기다림
  • stat_loc 변수에 저장되는 값
    • 자식 프로세스가 정상적으로 종료된다면 자식 프로세스가 반환한 exit 값이 저장됨
    • 자식 프로세스가 비정상적으로 종료된다면 비정상 종료 이유를 담은 매크로 값이 출력됨
    • waitpid 함수에 오류가 발생할 경우 에러코드
  • options 변수
    • WCONTINUED : 중단 되었다가 재개된 자식 프로세스의 상태를 받음
    • WNOHANG : 기다리는 PID가 종료되지 않아서 즉시 종료 상태를 회수 할 수 없는 상황에서 호출자는 차단되지 않고 반환값으로 0을 받음
    • WUNTRACED : 중단된 자식 프로세스의 상태를 받음
  • 자식 프로세스가 종료되면 자식 프로세스의 pid를 반환하고, 자식 프로세스가 존재하지 않을 때나 에러가 발생하면 -1을 반환하며 두 경우 모두 stat_loc 변수에 자식 프로세스가 반환한 exit 값 또는 에러 코드가 저장됨

wait3

pid_t wait3(int *stat_loc, int options, struct rusage *rusage);
  • rusage 변수를 통해 자식 프로세스의 리소스 사용량에 대한 정보를 알 수 있다
  • wait4 함수와 다른 점은 wait3 함수는 wait4 함수에서 pid가 -1로 고정된 채로 동작한다
    • 그 말인즉슨 특정 프로세스가 아닌 모든 자식 프로세스를 기다린다는 뜻 (wait 함수처럼)
  • 결론은 waitpid 함수에 rusage 매개변수를 추가하고 pid를 =1로 고정시킨 것과 같다
  • 자식 프로세스가 종료되면 자식 프로세스의 pid를 반환하고, 자식 프로세스가 존재하지 않을 때나 에러가 발생하면 -1을 반환하며 두 경우 모두 stat_loc 변수에 자식 프로세스가 반환한 exit 값 또는 에러 코드가 저장됨

wait4

pid_t wait4(pid_t pid, int *stat_loc, int options, struct rusage *rusage);
  • 특정 자식 프로세스 (pid) 의 종료를 기다리되 rusage 변수를 통해 자식 프로세스의 리소스 사용량에 대한 정보를 알 수 있다
  • wait3 함수와 다르게 pid를 입력받아 특정 자식 프로세스만 기다릴 수 있다
  • 결론은 waitpid 함수에 rusage 매개변수를 추가한 것과 같다 (rusage를 NULL로 맞춰주면 waitpid와 동일하게 작동)
  • 자식 프로세스가 종료되면 자식 프로세스의 pid를 반환하고, 자식 프로세스가 존재하지 않을 때나 에러가 발생하면 -1을 반환하며 두 경우 모두 stat_loc 변수에 자식 프로세스가 반환한 exit 값 또는 에러 코드가 저장됨

sys/stat.h

struct stat

struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */
         dev_t    st_dev;    /* device inode resides on */
         ino_t    st_ino;    /* inode's number */
         mode_t   st_mode;   /* inode protection mode */
         nlink_t  st_nlink;  /* number of hard links to the file */
         uid_t    st_uid;    /* user-id of owner */
         gid_t    st_gid;    /* group-id of owner */
         dev_t    st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t    st_size;   /* file size, in bytes */
         quad_t   st_blocks; /* blocks allocated for file */
         u_long   st_blksize;/* optimal file sys I/O ops blocksize */
         u_long   st_flags;  /* user defined flags for file */
         u_long   st_gen;    /* file generation number */
};

st_mode에 들어가는 파일 상태 코드

#define S_IFMT 0170000           /* type of file */
#define        S_IFIFO  0010000  /* named pipe (fifo) */
#define        S_IFCHR  0020000  /* character special */
#define        S_IFDIR  0040000  /* directory */
#define        S_IFBLK  0060000  /* block special */
#define        S_IFREG  0100000  /* regular */
#define        S_IFLNK  0120000  /* symbolic link */
#define        S_IFSOCK 0140000  /* socket */
#define        S_IFWHT  0160000  /* whiteout */
#define S_ISUID 0004000  /* set user id on execution */
#define S_ISGID 0002000  /* set group id on execution */
#define S_ISVTX 0001000  /* save swapped text even after use */
#define S_IRUSR 0000400  /* read permission, owner */
#define S_IWUSR 0000200  /* write permission, owner */
#define S_IXUSR 0000100  /* execute/search permission, owner */

stat

int stat(const char *restrict path, struct stat *restrict buf);
  • 파일경로 문자열 path에 해당하는 파일의 정보를 받아온다
    • 정보에는 파일의 크기, 권한, 생성일시, 최종변경일 등의 상태가 포함된다
  • stat 함수는 path에 해당하는 파일이 심볼릭 링크라면 원본 파일의 정보를 받아온다
  • 성공적으로 받아왔다면 정보를 buf 버퍼에 넣고, 0을 반환한다. 실패했다면 -1을 반환하고 errno가 세팅된다

lstat

int lstat(const char *restrict path, struct stat *restrict buf);
  • stat과 비슷한 역할을 하되 path에 해당하는 파일이 심볼릭 링크라면 원본 파일 대신 심볼릭 링크 파일의 정보를 받아온다
  • 성공적으로 받아왔다면 정보를 buf 버퍼에 넣고, 0을 반환한다. 실패했다면 -1을 반환하고 errno가 세팅된다

fstat

int fstat(int fildes, struct stat *buf);
  • stat과 비슷한 역할을 하되 path 대신 파일 디스크립터인 fildes를 이용하여 정보를 받아온다
  • 성공적으로 받아왔다면 정보를 buf 버퍼에 넣고, 0을 반환한다. 실패했다면 -1을 반환하고 errno가 세팅된다

dirent.h

struct dirent

struct dirent {
        ino_t d_ino; /* inode number */ 
        off_t d_off; /* offset to the next dirent */ 
        unsigned short d_reclen; /* length of this record */ 
        unsigned char d_type; /* type of file; not supported by all file system types */ 
        char d_name[256]; /* filename */ 
};

opendir

DIR * opendir(const char *filename);
  • filename에 명시된 경로의 디렉토리를 열고, 디렉토리 스트림과 연동시킨다
  • 성공적으로 디렉토리를 열었을 경우 디렉토리를 식별하는 디렉토리 스트림 포인터가 반환되며, 실패했을 경우 (디렉토리에 액세스할 수 없거나 널값일 때) 널 포인터를 반환한다

readdir

struct dirent * readdir(DIR *dirp);
  • 디렉토리 스트림 dirp의 하위 파일 및 디렉토리 정보를 하나 읽어들인다
  • 읽어들이는 순서는 따로 없으며 폴더 내의 파일이나 디렉토리들이 차례로 출력됨
  • dirent 구조체에서 d_name을 제외한 항목들은 시스템마다 사용가능할 수도 있고 아닐 수도 있으므로 d_name만 보통 많이 사용한다
  • 성공적으로 파일 정보 하나를 받아오면 그 파일의 정보가 담긴 dirent 구조체를 반환하고, 실패하였을 경우 널 포인터를 반환한다

closedir

int closedir(DIR *dirp);
  • 디렉토리 스트림 dirp를 닫는다 (파일 디스크립터 닫듯이)
  • 성공적으로 스트림을 닫았을 경우 0을 반환하고, 실패하였을 경우 -1을 반환한다

stdio.h

printf

int printf(const char * restrict format, ...);

string.h

strerror

char * strerror(int errnum);
  • errnum에 해당하는 에러 문구 스트링을 반환한다
  • errnum이 존재하지 않을 경우 "Unknown error: (errnum)" 을 반환한다

sys/errno.h

errno

extern int errno
  • 오류번호가 저장된다
  • 꽤 많은 함수가 동작에 실패했을 경우 errno에 에러 번호를 세팅하고 -1을 반환하는 식으로 동작한다
  • errno를 사용하여 strerror() 함수 등으로 에러 내용을 구할 수 있다

sys/ioctl.h

ioctl

int ioctl(int fildes, unsigned long request, ...);
  • 디바이스 드라이버를 컨트롤할 수 있는 함수
  • read(), write() 만으로는 해결할 수 없는, 장치에 특화된 입출력 / 제어 동작을 수행하고자 할 때 사용하는 호출이다
  • fildes는 디바이스 드라이버의 fd 값, request는 수행할 동작 (디바이스에 전달할 명령)
  • 뒤의 가변인자는 request에 해당하는 명령에 대한 보조적인 정보값

readline/readline.h

readline

char *readline(const char *prompt);
  • 터미널로부터 한 줄을 읽어들여 반환한다
    • 약간 get_next_line 느낌 난다
  • 받아온 한 줄은 malloc 된 포인터값으로 넘겨받기 때문에 호출 완료 후 사용자가 알아서 free를 해주지 않으면 큰일난다
  • 반환값은 받아온 한 줄 (string) 의 첫 번째 주소값이며, EOF를 만나면서 다른 문자가 하나도 없을 경우 NULL을 반환한다

rl_on_new_line

int rl_on_new_line(void)
  • 한 줄을 출력하고 나서 다음 새 줄로 옮겨가겠다고 알려주는 함수

rl_replace_line

int rl_replace_line(const char *text, int clear_undo)
  • rl_line_buffer의 내용물을 text로 교체한다
    • point와 mark는 남아있음
  • clear_undo가 0이 아닐 경우 현재 줄과 관련된 undo list를 비운다

rl_redisplay

int rl_redisplay(void)
  • 화면에 출력된 값을 rl_line_buffer 안에 저장된 내용물로 바꾼다

add_history

void add_history(char *string)
  • string을 history list 끝에 저장한다, 연관 데이터는 NULL로 설정된다

signal.h

signal

void (*)(int) signal(int sig, void (*handler)(int));
  • 시그널 처리 방법을 설정한다
  • 몇몇 시그널들은 이미 정의된 행동을 함으로써 처리되는데, 이처럼 기존에 정의된 행동을 그대로 할 지, 시그널을 그냥 무시할지, 아니면 사q용자 정의 행동을 하도록 바꿔줄 지 선택할 수 있다
  • sig는 처리해줄 시그널 번호
  • *handler는 시그널을 처리해줄 핸들러SIG_IGN을 인자로 넘겨주면 해당 시그널을 무시한다
  • 함수포인터를 넘겨주면 시그널이 들어왔을 때 특정 함수를 호출한다
  • SIG_DFL을 인자로 넘겨주면 기존에 정의된 방법대로 수행한다

시그널 (Signal) 이란?

Signal

kill

int kill(pid_t pid, int sig);
  • 무시무시한 이름과는 다르게.. 죽이는 짓은 안하고 시그널만 전달해주는 얌전한 함수
  • pid에 시그널을 받을 프로세스의 id가 들어간다pid가 0일 경우: 시그널을 보낸 프로세스와 같은 그룹에 속한 (그룹아이디가 같은) 모든 프로세스에 시그널이 보내짐
    • 유저가 관리자 권한을 가지고 있다면 (Superuser privilege) 시스템 프로세스와 현재 시그널을 전송하려는 프로세스를 제외한 모든 프로세스에 시그널을 전송
    • 유저가 관리자 권한을 가지고 있지 않다면, 해당 유저와 같은 uid를 가진 프로세스에만 현재 시그널을 전송
  • pid가 -1일 경우:
  • pid가 0보다 클 경우: 해당 pid에 시그널이 보내짐
  • sig에 해당 프로세스에 보낼 시그널이 들어간다sig에 0을 넣을 경우 에러 체킹을 시도하며, pid의 유효성을 검사할 수 있다
  • 이때 인자값으로 들어갈 signal은 sigaction()에 이미 정의되어 있어야 함
  • 정상적으로 kill 함수가 수행되면 0을 리턴, 에러 발생 시에는 -1 리턴 및 errno 세팅됨

termios.h

struct termios

struct termios {
    tcflag_t c_iflag;
    tcflag_t c_oflag;
    tcflag_t c_cflag;
    tcflag_t c_lflag;
    cc_t c_cc[NCCS];
    speed_t c_ispeed;
    speed_t c_ospeed;
};
  • c_iflag: 입력과 관련된 터미널 속성 변경
  • c_oflag: 출력과 관련된 터미널 속성 변경
  • c_cflag: 직렬 (시리얼) 통신과 관련된 터미널 속성 변경
  • c_lflag: 실제 사용자에게 보여지는 터미널 속성 (출력의 반향 (ECHO) 및 특수문자 (ctrl+c, ctrl+d 등) 변경
  • 각 플래그에 대한 속성값

tcgetattr

int tcgetattr(int fildes, struct termios *termios_p);
  • 터미널 속성을 가져온다
  • fildes는 속성을 알기 원하는 (open 된 상태의) 파일 디스크립터이며, 해당 파일의 터미널 속성은 구조체 termios_p에 들어간다
  • 성공적으로 속성을 받아왔을 경우 0을 반환하고, 실패하였으면 -1을 반환한 후 errno를 설정한다

tcsetattr

int tcsetattr(int fildes, int optional_actions, const struct termios *termios_p);
  • 비트 연산을 이용하여 특정 파일의 터미널 속성 값을 변경할 수 있다
  • 파일 fildes는 속성을 변경시키기 원하는 (open 된 상태의) 파일 디스크립터
  • tcgetattr을 통해 가져온 터미널 속성 termios_p를 적절히 변경시키고 (해당 구조체의 멤버변수를 이용해도 됩니다) 이를 인자로 넣어주면 속성을 변경할 수 있다
  • optional_actions에는 특정 상수를 넣어 속성값 변경 시점을 바꿔줄 수 있다
    • TCSANOW: tcsetattr을 호출한 즉시 속성 변경 사항이 적용됨
    • TCSADRAIN: 해당 파일 지정자에 대한 모든 출력이 종료된 다음 속성 변경 사항이 적용됨
    • TCSAFLUSH: 해당 파일 지정자에 대한 모든 출력이 종료된 다음 속성 변경 사항이 적용되며, 변경사항이 적용될 때 읽혀지지 않은 데이터는 버려진다 (flush된다)

termcap.h

tgetent

int tgetent(char *bp, const char *name);
  • name에 해당하는 엔트리를 연다
  • 에뮬레이션 시에는 bp 버퍼 포인터를 무시한다 (어떻게 써야 할 지 모르겠다면 NULL로 방치해도 상관없다)
  • 성공적으로 엔트리를 열었다면 1을 반환하고, name에 해당하는 엔트리가 없을 경우 0을 반환하며 terminfo 데이터베이스가 존재하지 않을 경우 -1을 반환한다

tgetflag

int tgetflag(char *id);
  • id에 대한 boolean 엔트리를 반환한다
  • 엔트리가 존재하지 않을 경우 (사용 불가할 경우) 0을 반환한다

tgetnum

int tgetnum(char *id);
  • id에 대한 numeric 엔트리를 반환한다
  • 엔트리가 존재하지 않을 경우 (사용 불가할 경우) -1을 반환한다

tgetstr

char *tgetstr(char *id, char **area);
  • id에 대한 string 엔트리를 반환한다
    • 반환값은 area가 가리키는 버퍼에도 똑같이 복사되며, 널 터미네이트 된다
  • 엔트리가 존재하지 않을 경우 0을 반환한다

tgoto

char *tgoto(const char *cap, int col, int row);
  • 주어진 capability cap으로 매개변수를 초기화한다
  • 이 함수의 반환값은 tputs 으로 연결되어야 함

tputs

int tputs(const char *str, int affcnt, int (*putc)(int));
  • 주어진 termcap 또는 terminfo 이름에 대한 capability를 가져온다

'42 > 42s Cursus' 카테고리의 다른 글

[Rank 4] Cub3D - Raycasting 기초  (2) 2022.03.31
[Rank 4] Cub3D  (0) 2022.03.31
[Rank 3] Minishell - 시그널 정리  (0) 2022.02.03
[Rank 3] Minishell - 쌍따옴표와 홑따옴표  (4) 2022.02.03
[Rank 3] Minishell - Fork, Pipe 함수 연습  (0) 2022.02.03
Comments