[42Seoul/minishell] 사용 가능한 외부 함수 (2) - 프로세스 생성 및 관리 함수

yebeen·2022년 8월 10일
0

42-Seoul/minishell

목록 보기
3/9
post-thumbnail
사용 가능한 외부 함수
readline, rl_on_new_line, rl_replace_line, rl_redisplay, add_history, printf, malloc, free, write, open, read, close, pipe, fork, wait, waitpid, wait3, wait4, unlink, execve, dup, dup2, exit, signal, kill, getcwd, chdir, stat, lstat, fstat, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs

프로세스 생성 및 관리 함수

pipex과제를 진행하며 다뤘던 함수들이 많습니다.

pipe()

서로 독립된 프로세스들이 데이터를 주고받을 수 있게 합니다. 하나의 파이프 및 파이프에 대한 두 개의 파일 디스크립터가 생성되며 하나의 파이프를 프로세스들이 공유합니다. 파이프 자체는 fork()에 의해 복사되지 않으며 방향성은 존재하지 않습니다.

#inlude <unistd.h>

int pipe(int fd[2]);
  • fd[2] : 크기가 2인 int 형 배열을 요구합니다.
    • fd[0] : 함수 호출 후 fd[0]에 데이터를 입력받을 수 있는 파일 디스크립터가 담깁니다. (파이프 출구, read)
    • fd[1] : 함수 호출 후 데이터를 출력할 수 있는 파일 디스크립터가 담깁니다.(파이프 입구, write)

fork()

현재 실행 중인 프로세스에서 자식 프로세스를 생성합니다. 생성된 자식 프로세스는 부모 프로세스의 메모리 상태를 그대로 갖게 됩니다. Program Counter 역시 복사되어 자식 프로세스는 fork() 호출 이후부터 Context를 갖게 됩니다.

#include <stdio.h>

pid_t fork(void);

부모 프로세스에는 자식 프로세스의 pid값이 fork()의 반환 값으로 설정됩니다.

  • 자식 프로세스의 경우 0을 반환합니다.
  • 부모 프로세스의 경우 양수를 반환합니다.
  • 비정상 수행되었을 경우 -1을 반환합니다.

wait()

#inlude <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()

자식 프로세스를 기다릴 때 사용하는 함수로 자식 프로세스의 종료 상태를 회수할 때 사용합니다.
기다릴 자식 프로세스를 좀 더 상세히 지정할 수 있습니다. wait()보다 좀 더 정교하게 자식 프로세스의 변화에 따른 제어를 할 수 있습니다.

#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *statloc, int options);

프로세스가 정상적으로 종료되었을 경우 프로세스 ID를 실패했을 경우 -1을 반환합니다.

  • pid
    • (pid == -1) : 임의의 자식 프로세스를 기다립니다.
    • (pid > 0) : 프로세스 ID가 pid인 자식 프로세스를 기다립니다.
    • (pid < -1) : 프로세스 그룹 ID가 pid의 절댓값과 같은 자식 프로세스를 기다립니다.
    • (pid == 0) : 호출한 프로세스의 프로세스 그룹 PID와 같은 프로세스 그룹 ID를 가진 프로세스를 기다립니다.
  • statloc
    • WIFEXITED(statloc) : 자식 프로세스가 정상적으로 종료된 경우 treu를 반환합니다.
    • WEXITSTATUS(statloc) : WIFEXITEDtrue를 반환한 경우에만 사용 가능하며 하위 8비트를 참조하여 자식 프로세스가 exit, _exit, _Exit에 넘겨준 인자 값을 얻습니다.
    • WIFSIGNALED(statloc) : signal에 의해 종료된 경우 true를 반환합니다. 
    • WTERMSIG(statloc) : 자식 프로세스를 종료시킨 signal의 숫자를 반환하며 WIFSIGNALEDtrue를 반환했을 경우 사용합니다.
    • ECHILD : 호출자의 자식 프로세스가 없는 경우를 나타냅니다.
    • EINTR : 시스템 콜이 인터럽트 되었을 때 사용합니다.
  • options
    • WCONTINUED : 중단되었다가 재개된 자식 프로세스의 상태를 받습니다.
    • WNOHANG : 기다리는 PID가 종료되지 않아서 즉시 종료 상태를 회수할 수 없는 상태에서 호출자는 차단되지 않고 반환 값으로 0을 받습니다.
    • WUNTRACED : 중단된 자식 프로세스의 상태를 받습니다.

wait3() & wait4()

자식 프로세스가 종료되는 것을 기다리며, 종료된 프로세스의 상태와 자원 사용량을 알려주는 함수입니다.

#include <sys/wait.h>
#include <sys/types.h>
#include <sys/resource.h>
#include <sys/time.h>

pid_t wait3(int *statloc, int options, struct rusage *rusage);
pid_t wait4(pid_t pid, int *statloc, int options, struct rusage *rusage);
  • statloc는 자식 프로세스의 종료 상태를 나타내는 정보를 담아줍니다. (wait() 참조)
  • options는 프로세스의 종료 상태 체크 시 옵션을 설정할 수 있습니다. (wait() 참조)
  • rusage에 자식 프로세스의 리소스 사용량에 대한 정보가 담깁니다.
  • pidwait4()에서 사용되는 매개변수로, pid에 해당하는 프로세스만을 기다립니다.
    프로세스가 정상적으로 종료되면 프로세스 ID를, 그렇지 않을 경우 -1을 반환합니다.

profile
🐣🐥

0개의 댓글