minishell에서 사용 가능한 함수를 정리해 봤습니다.
여기에서 빠진 함수들은 이전 과제에서 설명했던 함수거나, 이미 사용하고있던 함수입니다.
그리고 과제를 하면서 사용하지 않았던 함수도 많다보니 부족한 부분이 있다면 말씀해주세요...!
readline, rl_on_new_line, rl_replace_line, rl_redisplay, add_history, printf, malloc, free, write, open, read, close, fork, wait, waitpid, wait3, wait4, signal, kill, exit, getcwd, chdir, stat, lstat, fstat, unlink, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs
#include <readline/readline.h>
#include <readline/history.h>
char *readline (const char *prompt);
용도
readline은 char *prompt
를 터미널에 띄워주고 터미널에서 입력된 문자열을 리턴해 줍니다.
매개변수
출력할 문자열
리턴 값
읽어들인 문자열을 리턴합니다.(개행이 제거됩니다.)
빈 문자열이라면 빈 문자열을 리턴합니다.
만약 어떤 값도 읽어들이지 못 한다면 NULL을 리턴합니다.(EOF)
기타
readline내부에서 errno를 세팅합니다. 예를어서 헤더파일을 잘 못 설정한다면 errno=2가 설정되고 문제가 없다면 errno=0이 됩니다.
#include <readline/readline.h>
#include <readline/history.h>
int rl_on_new_line()
mac에서는 포함되지 않아서 brew를 통해서 readline을 설치한 후 나오는 옵션을 넣어서 컴파일 해주세요.
ex)
-L/usr/local/opt/readline/lib
-I/usr/local/opt/readline/include
void rl_replace_line (const char *text, int clear_undo)
char *text
로 대체합니다.#include <readline/readline.h>
#include <readline/history.h>
void rl_redisplay (void)
#include <readline/readline.h>
#include <readline/history.h>
void add_history (char *string)
char *string
을 히스토리 목록에 넣습니다.#include <unistd.h>
int pipe(int pipefd[2]);
#include <unistd.h>
pid_t fork(void);
용도
fork함수를 사용한 프로세스를 복제하여 새로운 프로세스를 만듭니다.
이렇게 만들어진 프로세스는 자식 프로세스로 참조되고, 해당 함수를 불러낸 프로세스는 부모 프로세스로 참조됩니다.
자식 프로세스는 부모프로세스와 분리된 별도의 메모리 영역을 사용하게 됩니다.
이 메모리 영역에는 부모 프로세스가 fork함수를 호출하기 이전까지의 메모리 영역을 그대로 복사하게 되고, 자식프로세스는 이렇게 복사된 메모리를 토대로 fork함수를 호출한 이후의 시점부터 부모프로세스와 별개로 실행되게 됩니다.
성공시, 부모 프로세스에 자식 프로세스의 PID를 리턴하고 자식 프로세스에는 0을 리턴합니다.
실패시, 자식 프로세스는 생성되지 않고 부모 프로세스에는 -1을 리턴한 뒤 errno에 error코드를 표시합니다.
에러코드
#include <sys/wait.h>
pid_t wait(int *wstatus);
용도
자식 프로세스가 종료되는 걸 기다리고 종료된 자식 프로세스의 자원을 반환하는 역할을 합니다.
만약 종료된 프로세스의 자원을 반환하지 않는다면 좀비상태가 되어 남아있게 됩니다.
그리고 해당 함수를 호출할 때 자식 프로세스가 종료된 상태라면 바로 리턴을 호출하고, 그게 아니라면 종료되거나, 시그널 핸들러가 호출을 중단시킬때까지 대기합니다.
매개변수
리턴 값
정상 종료 시 자식 프로세스의 pid, 실패 시 -1을 반환합니다.
에러코드
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *wstatus, int options);
용도
기본적으로 wait과 동일한 동작을 하거나, 옵션을 통해서 자식프로세스의 상태 변경을 기다릴 수도 있습니다.
그리고 첫 번째 매개변수인 pid에 의해 지정된 자식 프로세스만을 대상으로 합니다.
매개변수
리턴 값
정상 종료시 상태 변경된 자식 프로세스의 PID를 반환합니다.
만약 WNOHANG옵션이 사용되고 자식 프로세스가 아직 상태가 변경되지 않은 상태라면 0을 리턴합니다.
실패시 -1을 리턴합니다.
에러코드
참고 : wait
waitpid나 waitid를 사용하라고 합니다.
#include <unistd.h>
char *getcwd(char *buf, size_t size);
#include <unistd.h>
int chdir(const char *path);
#include <dirent.h>
DIR *opendir(const char *name);
typedef struct {
int __dd_fd; /* file descriptor associated with directory */
long __dd_loc; /* offset in current buffer */
long __dd_size; /* amount of data returned */
char *__dd_buf; /* data buffer */
int __dd_len; /* size of data buffer */
long __dd_seek; /* magic cookie returned */
__unused long __padding; /* (__dd_rewind space left for bincompat) */
int __dd_flags; /* flags for readdir */
__darwin_pthread_mutex_t __dd_lock; /* for thread locking */
struct _telldir *__dd_td; /* telldir position recording */
} DIR;
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
#include <dirent.h>
int closedir(DIR *dirp);
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* Inode number */
mode_t st_mode; /* File type and mode */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
dev_t st_rdev; /* Device ID (if special file) */
off_t st_size; /* Total size, in bytes */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
#include <sys/stat.h>
int lstat(const char *path, struct stat *buf);
#include <sys/stat.h>
int fstat(int fd, struct stat *buf);
#include <unistd.h>
int unlink(const char *pathname);
#include <unistd.h>
int execve(const char *pathname, char *const argv[], char *const envp[]);
#include <unistd.h>
int dup(int oldfd);
#include <unistd.h>
int dup2(int oldfd, int newfd);
#include <string.h>
char *strerror(int errnum);
#include <errno.h>
#include <unistd.h>
int isatty(int fd);
#include <unistd.h>
char *ttyname(int fd);
#include <unistd.h>
int ttyslot(void);
#include <termios.h>
int tcgetattr(int fildes, struct termios *termios_p);
struct termios {
tcflag_t c_iflag; /* input flags */
tcflag_t c_oflag; /* output flags */
tcflag_t c_cflag; /* control flags */
tcflag_t c_lflag; /* local flags */
cc_t c_cc[NCCS]; /* control chars */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
};
#include <termios.h>
int tcsetattr(int fildes, int optional_actions, const struct termios *termios_p);
#include <term.h>
int tgetent(char *bp, const char *name);
용도
name에 대한 항목을 가져옵니다.
리턴 값
성공 시 1, 해당 항목이 없는 경우는 0, terminfo 데이터베이스를 찾을 수 없는 경우 -1을 리턴합니다.
#include <term.h>
int tgetflag(char *id);
#include <term.h>
int tgetnum(char *id);
#include <term.h>
char *tgetstr(char *id, char **area);
#include <term.h>
char *tgoto(const char *cap, int col, int row);
#include <term.h>
int tputs(const char *str, int affcnt, int (*putc)(int));
#include <stdlib.h>
char *getenv(const char *name);
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);