Search
Duplicate
🌑

프로세스 생성과 종료 함수

간단소개
unix를 구성하는 함수 중 프로세스의 생성과 종료를 다루는 함수에 대해 간단히 알아봤습니다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Linux
Scrap
태그
9 more properties

fork

자신과 동일한 프로세스를 생성하는 함수이다.
성공시 부모 프로세스에선 자식 프로세스의 pid를 반환하고 자식 프로세스에선 0을 반환한다.
실패시 -1을 반환한다.
#include <unistd.h> #include <sys/types.h> pid_t fork(void); pid_t vfork(void);
C
복사
fork는 두 프로세스가 작동하지만 vfork는 자식 프로세스가 생성되고 종료될 때 까지 부모 프로세스가 일시적으로 중단된다.

exec - execute a file

#include <unistd.h> int execl(const char *path, const char *arg0, ..., /*, (char *)0, */); int execle(const char *path, const char *arg0, ..., /* (char *)0 char *const envp[] */); int execlp(const char *file, const char *arg0, ..., /*, (char *)0, */); int execv(const char *path, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]); int execvp(const char *file, char *const argv[]); int execvP(const char *file, const char *search_path, char *const argv[]);
C
복사
반환값 : 성공시 0(하지만 받을 프로세서가 없다), 실패시 -1
l : 함수에서 가변인자를 지원하기때문에 원하는 만큼의 인자를 넘긴 뒤 NULL로 인자의 끝을 표기해준다.
v : 문자열 배열로 받는다
stdlib.h를 사용해 main(int argc, char *argv[])으로 받아 마지막에 NULL을 넣을 수 있는 새 배열을 만들어 인자로 넣는다고 한다.
e : 프로세스가 시작할 때 받아오는 환경변수 envp를 전달한다.
#include <stdlib.h> // 환경 변수를 받아올 땐 이렇게 main 함수를 작성해야 한다고 한다. int main(int argc, char *argv[], char *envp){return (0);}
C
복사
p : 환경 변수 중 PATH를 읽어 파일을 탐색한다.
PATH에서 탐색에 실패한 경우 paths.h에서 PATH_DEFPAHT를 참조한다. 그 값은 “/usr/bin:/bin”로 정의되어있다.
exec 뒤에 p가 없는 경우 절대경로로 파일의 위치까지 명시해야한다.
P : 탐색할 경로를 추가적으로 넣어줄 수 있다.

wait

#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); pid_t wait3(int *stat_loc, int option, struct rusage *rusage); pid_t wait4(pid_t pid, int *stat_loc, int option, struct rusage *rusage); pid_t waitpid(pid_t pid, int *stat_loc, int option);
C
복사
stat_loc은 자식 프로세스가 exit()을 통해 반환한 값에 <<8된 정수이다.
자식 프로세스에서 어떤 값을 넣던지 하위 1바이트만 반환하고 그 값이 부모프로세스의 stat_loc의 두번째 바이트에 저장되는 구조이다.
여러 자식 프로세스가 있을 때 wait는 먼저 발생한 exit()에 작동한다. 이러한 경우 자식 프로세스가 반환하는 값을 기준으로 어떤 자식인지 구분할 수 있다.
waitpid는 특정 자식 프로세스의 종료까지 대기한다.

exit

#include <stdlib.h> void exit(int status); void atexit(void (*funtion)(void)); void _exit(int status); void _Exit(int status);
C
복사
exit 함수 계열을 기본적으로 프로세스를 종료한다.
exit()으로 종료할 때 clean-up-action을 작동시킨다.
최대 32개까지 등록할 수 있으며 실행순서는 등록의 역순인 스택이다.
_exit()으로 종료할 땐 clean-up-action을 작동시키지 않는다.