728x90
open
#include <fcntl.h>
int open(const char *filename, int flags[, mode_t mode]);
- 파일을 사용하기 위해 사용하는 함수입니다.
- 파일 열기에 성공하면 양의 정수 값을 반환하며 실패했을 경우 -1을 반환합니다.
- mode_t mode : O_CREAT 옵션 사용에 의해 파일이 생성될 때 지정되는 파일 접근 권한입니다.
- O_RDONLY : 읽기 전용으로 파일을 엽니다.
- O_WRONLY : 쓰기 전용으로 파일을 엽니다.
- O_RDWR : 읽기와 쓰기가 모두 가능입니다.
- O_TRUNC : 기존의 파일 내용을 모두 삭제합니다.
- O_EXCL : 파일이 열려있을 때 open()되지 않아 이전 파일을 보존할 수 있습니다.
- O_CREAT : 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 합니다.
- open("outfile.txt", O_WRONLY | O_CREAT, 0644);
- open("./file.txt", O_WRONLY | O_CREAT | O_EXCL, 0644) : 파일이 없을 경우 새로 생성되며 파일이 이미 존재하면 open()이 실패됩니다.
close
#include <unistd.h>
int close(int fd);
- open()으로 연 파일을 사용 중지합니다.
- 정상적으로 종료되었을 경우 0을 실패했을 경우 -1을 반환합니다.
read
#include <unistd.h>
size_t read(int fd, void *buf, size_t nbyres);
- 정상적으로 실행되었을 경우 양수를 실패했을 경우 -1을 반환합니다.
write
#include <unistd.h>
size_t write(int fd, const void *buf, size_t n);
- 쓰기에 성공한 쓰기 한 바이트 개수를 실패했을 경우 -1을 반환합니다.
perror
#include <stdio.h>
void perror(const char *s);
- 인자로 들어온 문자열을 출력하고, 현재 설정된 error에 해당하는 메시지를 클론과 공백 문자를 붙여 출력합니다.
- 발생한 error는 eerno.h의 errno에 저장이 됩니다. 에러가 발생하지 않으면 기본값은 0이고 발생한 에러에 따라 index로 errno가 설정됩니다.
- errno는 호출한 시스템 콜의 성공 여부에 따라서 그 값이 경신되며 직후에 perror를 사용하여 에러를 출력하지 않으면 다른 에러에 의해 errno가 갱신될 수 있기 때문에 주의해야 합니다.
strerro
#include <string.h>
char * strerror(int errnum);
- erro.h에는 error발생 시 설정되는 index들이 정의되어 있습니다. error에 대한 index값을 strerror에 넣게 되면, index에 해당하는 문자열을 반환하게 됩니다.
access
#include <unistd.h>
int access(const char *path, int mode);
- path에 해당하는 파일을 mode에 따라서 확인합니다.
- mode에 만족하면 -을 그렇지 않으면 -1을 반환합니다.
- mode값
- #define F_OK : 0
- #define X_OK : (1<<0)
- #define W_OK : (1<<0)
- #define R_OK : (1<<0)
dup
#include <unistd.h>
int dub(int fd);
- fd라는 파일 디스크립터를 인자로 사용합니다.
- 복제된 파일 디스크립터의 값을 반환합니다.
- 문제가 발생하면 -1을 반환합니다.
dup2
#include <unistd.h>
int dup2(int fd, int fd2);
- dup2는 dup과 동작 방식은 동일합니다.
- 반환 값이 사용자가 사용하는 fd2라는 값이 나올 수 있도록 fd라는 인자를 사용하여 복제를 수행합니다.
- 함수의 결과는 fd2가 fd가 가리키는 파일 디스크립터를 가리키게 됩니다.
- 문제가 발생하면 -1을 반환합니다.
execve
#include <unistd.h>
int execve(const char *file, char * const *argv, char * const *envp);
- 인자로 받은 파일에 대해서 실행하고 정상 동작할 경우 0을 문제가 발생할 경우 -1을 반환합니다.
- exec 계열의 함수는 함수 이름 뒤에 l(list), v(vector), e(environment), p(path),... 가 붙게 됩니다.
int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ..., const char *argn, (char *)0, char *const envp[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ... const char *argn, (char *)0);
int execv(const char *file, char *const argv[]);
- path VS envp
- path : PATH의 환경에 등록된 디렉터리의 파일들을 실행하기 때문에 명령어를 전체 경로가 아닌 명령어만 인자 값으로 넘겨도 됩니다.
- envp : envp환경변수에 등록된 모든 디렉터리의 파일들을 실행하기 때문에 전체 경로를 인자 값으로 넘겨야 됩니다.
exit
#include <stdlib.h>
- 프로세스 내 파일 입출력 중인 것을 저장하며 프로세스를 종료합니다.
- 정상 종료되면 0을 1은 에러 메시지 종료입니다.
- 0 : EXIT_SUCCESS
- 1 : EXIT_FAILURE
fork
#include <stdio.h>
pid_t fork(void);
- 현재 실행 중인 프로세스에서 자식 프로세스를 생성합니다.
- 생성된 자식 프로세스는 부모 프로세스의 메모리 상태를 그대로 갖게 됩니다.
- Program Counter 역시 복사되어 자식 프로세스는 fork함수 호출 이후부터 Context를 갖게 됩니다.
- 부모 프로세스에는 자식 프로세스의 pid값이 fork의 반환 값으로 설정됩니다.
- 자식 프로세스 : 0
- 부모 프로세스 : >0
- 비정상 수행 : -1
pipe
#include <unistd.h>
int pipe(int fd[2]);
- 서로 독립된 프로세스들이 데이터를 주고받을 수 있게 합니다.
- 하나의 파이프 및 파이프에 대한 두 개의 파일 디스크립터가 생성됩니다.
- 하나의 파이프를 프로세스들이 공유됩니다.
- 파이프 자체는 fork()에 의해 복사되지 않으며 방향성은 존재하지 않습니다.
- fd[2] : 크기가 2인 int 형 배열을 요구합니다.
- fd[0] : 함수 호출 후 fd[0]에 데이터를 입력받을 수 있는 파일 디스크립터가 담깁니다. (파이프 출구, read)
- fd[1] : 함수 호출 후 데이터를 출력할 수 있는 파일 디스크립터가 담깁니다.(파이프 입구, write)
unlink
#include <unistd.h>
int unlink(const char *path);
- 하드 링크를 끊는데 이용합니다.
- 정상적으로 하드 링크를 끊으면 0을 그렇지 않으면 -1을 반환합니다.
- 하드 링크의 이름을 삭제하면 inode를 참조하고 있는 하나의 하드 링크를 끊어 링크의 개수를 하나 줄입니다.
- path에 명시된 하드 링크는 삭제가 되지만 해당 inode를 참조하고 있는 모든 하드 링크가 지워지는 것은 아니기 때문에 그 파일의 하드 링크가 여러 개라면 여전히 그 파일은 존재하게 됩니다.
- 하드 링크의 참조 개수가 0이 되면 실제 파일의 내용이 저장되어 있는 disk space를 free 하여 OS가 다른 파일을 위해서 사용할 수 있도록 합니다.
- open으로 파일이 열린 상태에서 unlink를 호출하여 참조 개수가 0이 되어도 파일 이름 등의 정보는 삭제되지만 disk space는 해제되지 않음
wait
#include <sys/wait.h>
pid_t wait(int *statloc);
- 프로세스가 정상적으로 종료되었을 경우 프로세스 ID를 실패했을 경우 -1을 반환합니다.
- statloc : 자식 프로세스의 상태를 아웃 파라미터로 받습니다. (필요 없을 경우 NULL)
- WIFEXITED(statloc) : true를 반환합니다.
- WEXITSTATUS(statloc) : 하위 8비트를 참조하여 자식 프로세스가 exit, _exit, _Exit에 넘겨준 인자 값을 얻을 수 있습니다.
- WIFSIGNALED(statloc) : true를 반환합니다.
- WTERMSIG(statloc) : 비정상 종료 이유를 구할 수 있습니다.
- ECHILD : 호출자의 자식 프로세스가 없는 경우 사용합니다.
- EINTR : 시스템 콜이 인터럽트 되었을 때 사용합니다.
waitpid
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *statloc, int options);
- 자식 프로세스를 기다릴 때 사용하는 함수입니다. 자식 프로세스의 종료 상태를 회수할 때 사용합니다.
- 기다릴 자식 프로세스를 좀 더 상세히 지정할 수 있습니다.
- wait()보다 좀 더 정교하게 자식 프로세스의 변화에 따른 제어를 할 수 있습니다.
- 프로세스가 정상적으로 종료되었을 경우 프로세스 ID를 실패했을 경우 -1을 반환합니다.
- pid
- (pid == -1) : 임의의 자식 프로세스를 기다립니다.
- (pid > 0) : 프로세스 ID가 pid인 자식 프로세스를 기다립니다.
- (pid < -1) : 프로세스 그룹 ID가 pid의 절댓값과 같은 자식 프로세스를 기다립니다.
- (pid == 0) : 호출한 프로세스의 프로세스 그룹 PID와 같은 프로세스 그룹 ID를 가진 프로세스를 기다립니다.
- statloc
- WIFEXITED(statloc) : 자식 프로세스가 정상적으로 종료된 경우 treu를 반환합니다.
- WEXITSTATUS(statloc) : WIFEXITED가 true를 반환한 경우에만 사용 가능하며 하위 8비트를 참조하여 자식 프로세스가 exit, _exit, _Exit에 넘겨준 인자 값을 얻습니다.
- WIFSIGNALED(statloc) : signal에 의해 종료된 경우 true를 반환합니다.
- WTERMSIG(statloc) : 자식 프로세스를 종료시킨 signal의 숫자를 반환하며 WIFSIGNALED가 true를 반환했을 경우 사용합니다.
- ECHILD : 호출자의 자식 프로세스가 없는 경우를 나타냅니다.
- EINTR : 시스템 콜이 인터럽트 되었을 때 사용합니다.
- options
- WCONTINUED : 중단되었다가 재개된 자식 프로세스의 상태를 받습니다.
- WNOHANG : 기다리는 PID가 종료되지 않아서 즉시 종료 상태를 회수할 수 없는 상태에서 호출자는 차단되지 않고 반환 값으로 0을 받습니다.
- WUNTRACED : 중단된 자식 프로세스의 상태를 받습니다.
728x90
반응형
'42 SEOUL > 2_pipex' 카테고리의 다른 글
[42Seoul/pipex] 프로젝트 소개 (0) | 2022.07.11 |
---|
댓글