치춘짱베리굿나이스
[Rank 3] Minishell - 사용가능 함수 정리 본문
무지많다 (화이팅
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를 가져온다
'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