MINISHELL
사용가능한 외부 함수
readline
#include <readline/readline.h>
#include <readline/history.h>
char *readline (const char *prompt);
- 용도
+ readline은 char *prompt를 터미널에 띄워주고 터미널에서 입력된 문자열을 리턴함
+ CTRL + D 를 입력해도 EOF로 인식됨 Editing 방식에 따른 Key Binding을 지원하기 때문
- 매개변수
+ 출력할 문자열
- 리턴 값
+ 읽어들인 문자열을 리턴함(개행은 제거됨)
+ 빈 문자열이라면 빈 문자열을 리턴함
+ 값을 읽어내지 못하면 NULL을 리턴함(EOF)
+ 리턴 값은 동적할당 된 것이므로 free()가 필요함(gnl과 비슷)
- 예제
+ https://wtg-study.tistory.com/103
rl_on_new_line
#include <readline/readline.h>
#include <readline/history.h>
int rl_on_new_line(void)
- 용도
+ readline 함수에 프롬프트가 개행문자를 만났다고 알려줌(알림 용도)
+ 보통 개행을 출력 한 후, 시그널을 처리할 때 사용함
+ 주로 rl_replace_line 및 rl_redisplay와 같이 사용함.
- 리턴 값
+ 아무 문제 없이 정상 수행되었다면 0 에러는 -1을 리턴함
rl_replace_line
#include <readline/readline.h>
#include <readline/history.h>
void rl_replace_line (const char *text, int clear_undo)
- 용도
+ 사용자가 쉘에 입력한 명령어는 rl_line_buffer라는 전역변수에 저장되는데 해당 문자열을 수정시 사용
+ editing기능을 지원하기에 undo_list에 명령어들을 저장하고 있는데 Undo를 사용하기 위함이다
- 매개변수
+ rl_line_buffer에 대치될 문자열 text
+ undo_list를 초기화할지 그대로 유지할지에 대한 옵션 0은 리스트를 유지하고 그 외의 int는 초기화시킴
rl_redisplay
#include <readline/readline.h>
#include <readline/history.h>
void rl_redisplay (void)
- 용도
+ rl_replace_line 함수를 선행으로 사용하였을때 대치된 명령어를 출력함char *text
add_history
#include <readline/readline.h>
#include <readline/history.h>
void add_history (char *string)
- 용도
+ char *string
를 히스토리 목록에 넣음.
+ 프롬프트가 열린 상태에서 키보드 위 아래 방향키로 문자열을 불러올 수 있다.
fork
#include <unistd.h>
pid_t fork(void);
- 용도
+ 호출한 프로세스를 복제한 자식 프로세스를 만듬
+ 호출되기 이전까지의 메모리 영역을 그대로 사용하며 호출 이후 시점부터 부모 프로세스와 별개로 실행됨
- 리턴 값
+ 성공시 부모 프로세스에는 자식의 PID를, 실패시 부모 프로세스에게 -1을 리턴함
wait
#include <sys/wait.h>
pid_t wait(int *wstatus);
- 용도
+ 자식 프로세스가 종료되는걸 대기하고 자식 프로세스의 자원을 반환함
+ return, exit로 정상종료시 값을 반환한다.
- 매개변수
+ wstatus에 리턴 값이 저장되며 시그널로 인한 종료일경우 시그널 번호가 저장됨
- 리턴 값
+ 정상종료시 자식 프로세스의 pid를 리턴, 실패시 -1을 리턴함
waitpid
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *wstatus, int options);
- 용도
+ 기본적으로 wait과 같은 동작을 수행하나, 옵션을 통해 자식 프로세스의 상태 변경을 기다림
- 매개변수
+ pid
+ pid < -1 : pid의 절댓값과 같은 자식 프로세스를 기다림
+ pid == -1 : 임의의 자식 프로세스를 기다림
+ pid > 0 : 프로세스 ID가 pid인 자식 프로세스를 기다림
+ pid == 0 : waitpid를 호출한 프로세스와 동일한 그룹ID를 가진 자식 프로세스를 대상으로 함
+ wstatus
+ 위의 매개변수와 동일 자식 프로세스의 리턴 값을 저장함
+ option
+ WNOHANG : 종료된 자식 프로세스가 없다면 리턴
+ WUNTRACED : 자식 프로세스가 멈추면 리턴
+ WCONTINUED : 멈췄던 자식 프로세스가 재개되었을때 리턴
- 리턴 값
+ 정상 종료시 변경된 자식 프로세스의 pid를 리턴함
+ WNOHANG옵션 사용시 자식 프로세스가 상태 변경이 안되었다면 0, 실패시 -1
wait3, wait4
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait3(int *status, int options, struct rusage *rus);
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rus);
- 용도
+ 사용자의 시간 정보를 확인하는 함수
- 매개변수
+ status, options, pid는 위와 동일
+ rusage는 자식 프로세스의 리소스 사용량에 대한 정보가 담긴다.
- 리턴 값
+ 정상 종료시 변경된 자식 프로세스의 pid를 리턴함
+ WNOHANG옵션 사용시 자식 프로세스가 상태 변경이 안되었다면 0, 실패시 -1
signal
#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
- 용도
+ 시그널 발생시 핸들링을 설정함.
- 매개변수
+ signum : 해당 번호의 시그널이 발생할경우
+ void (*handler) : 해당 함수 포인터로 핸들링.
- 리턴 값
+ 성공 시 이전에 설정된 시그널 핸들러를 리턴
kill
#include <signal.h>
int kill(pid_t pid, int signo);
- 용도
+ 프로세스에 시그널을 보냄.
- 매개변수
+ 입력된 pid를 가진 프로세스에 signo 시그널넘버를 보내 신호를 보냄
- 리턴 값
+ 0은 성공, -1은 실패
getcwd
#include <unistd.h>
char *getcwd(char *buf, size_t size);
- 용도
현재 작업폴더의 절대경로를 size만큼 buf에 복사함
- 매개변수
+ buf 절대경로가 복사될 버퍼
+ size 복사할 길이
- 리턴 값
성공 시 현재 작업폴더의 절대경로를 리턴함.(buf와 동일)
chdir
#include <unistd.h>
int chdir(const char *path);
- 용도
+ 호출 프로세스의 작업 경로를 변경함
- 매개변수
+ path 변경될 작업경로
- 리턴 값
+ 성공 시 0, 실패 시 -1
stat
#include <sys/stat.h>
int stat(const char * path, struct stat *buf);