Unborn 8.0 Yellow Pointer
본문 바로가기
42 SEOUL/2_pipex

[42Seoul/pipex] 허용 함수 정리 (access(), dup2(), execve(), fork(), pipe(), wait(), waitpid())

by 에삐니 2022. 7. 13.
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

댓글