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);
fildes2
를fildes1
로 바꾼다 (우회한다?)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
값이 들어간다envp
는key=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
가 넉넉치 않을 때 → ERANGEbuf
공간이 넉넉치 않은데size
를 무리하게 크게 줄 때 → 힙 오버플로우buf
공간도 넉넉치 않고size
도 적을 때 → ERANGEbuf
가 널포인터일 때 →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) 이란?
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를 가져온다