* 금오공과대학교 전준철 교수님 리눅스 프로그래밍 수업 6강 ~ 9강 정리
프로세스 생성과 종료
부모에서는 자식 PID 반환,
자식은 0을 반환
실패하면 -1을 반환
서로 완전히 다른 프로세스가 되지만 부모 자식간의 관계는 유지된다.
실행 환경은 부모나 자식이나 똑같다. 코드, 레지스터, 스택 등 물려받음.
PC : Program Counter
복제가 되어버려서, 완전히 다른 독립적인 프로세스로서 활동.
fork() 를 하면 pid 가 두개 생성
원하는 작업들을 분기 안에서 처리한다.
path 는 경로, file 은 실행 파일
arg 는 전달 인자 리스트
argv 는 문자열 포인터 배열 형태, 반드시 마지막에 NULL문자열을 넣어야 함.
호출 성공하면 호출한 프로세스는 종료됨.
ls -l subdir 과 같은 명령어를 치는 것과 같다.
부모 자식관계가 아니라 부르는 자와 불리는 자의 관계가 된다.
메모리 영역을 불리는 자가 차지하고, PID까지 가져간다.
l 은 리스트 형태 인자, v는 문자 포인터 배열형태 인자.
Caller 가 제거되는 것 확인.
fork 는 부모를 복제, exec 는 지정한 프로그램을 실행하는 것이 목적이다.
명령행 인자는 부모것을 그대로 사용 / 필요한 경우 새로 적용.
fork 호출 이후부터 자식이 실행되고, exec 는 새로운 프로그램을 처음부터 수행함.
자식과 부모 PID다르고 / 자식과 부모 PID 같다.
fork 와 exec 은 보통 함께 사용된다.
exit 호출 할 때 수행할 함수. 반환값을 가질 수 없다.
파일을 닫거나, 자식 프로세스를 회수하는 등의 작업을 한다.
최대 32개, 역순으로 실행된다.
클린업 액션이 필요 없을 경우 사용한다.
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
void clean_up_action(void);
int main(void){
pid_t pid;
int i;
char *arg[] = {"ls", "-l", "home/g2", NULL};
for(i = 0; i <3; i++){
printf("before fork [%d]\n", i);
sleep(1);
}
pid = fork();
if(pid >0){
for(; i <7; i++){
printf("parent [%d]\n", i);
sleep(1);
}
atexit(clean_up_action);
}else if(pid == 0){
for(; i <5; i++){
printf("child [%d]\n", i);
sleep(1);
execv("/bin/ls", arg);
}
}else{
printf("fail to fork child process \n");
}
exit(0);
return 0;
}
void clean_up_action(void){
printf("clean up action!\n");
}
자식 프로세스는 3, 4 를 찍어야 하는데, execv 를 하면 4는 찍히지 못한 채 종료되고, 새로운 프로그램이 실행된다.
'Linux Programming Basics' 카테고리의 다른 글
gcc / gdb / make (0) | 2020.07.03 |
---|---|
Shell 사용하기 (0) | 2020.07.03 |
[Linux Programming ] File Related API (0) | 2020.06.28 |
Linux : File Management Commands (0) | 2020.06.28 |
Linux : Command Environment (0) | 2020.06.28 |