프로세스 구성요소 회고
TEXT
: code (binary코드, 기계어)
BSS
: 변수 중에 초기값이 없는 것들
DATA
: 변수 중에 초기값이 있는 것들
>> 여기까지는 컴파일 시에 결정된다.
HEAP
: 동적 메모리, molloc()
STACK
: 함수를 처리를 위한 영역
>> 여기는 코드가 실행되면서 작어지거나 커지거나 유동적이다.
1. TEXT, BSS, DATA, HEAP, STACK의 공간이 생성된다.
2. 프로세스 이미지를 해당 공간에 업로드한다.
3. 실행한다.
fork()
별도의 프로세스 공간을 만들고, 부모 프로세스의 데이터를 그대로 복사한다.
<unistd.h>
pid_t fork(void);
부모프로세스와 자식프로세스의 pid값이 다르다
#include <sys/types.h>
#include <unistd.h>
#include <studio.h>
int main()
{
pid_t pid;
pid fork(void);
if (pid == 0)
printf("this is the child process");
else if (pid > 0)
printf("this is the parent process");
else //default는 -1
printf("fail");
return 0; //이걸 만나면 프로세스가 끝난다.
}
fork가 실행되면, 부모 프로세스와 동일한 자식 프로세스가 '별도의' 공간에 생성된다.
두 프로세스의 변수 및 PC(Process Count)는 동일하다.
exec()
별도의 프로세스 공간을 만들지 않고, 덮어씌운다.
exec 안에 param에 실행파일을 넣는다.
exec() 시스템 콜
<unistd.h>
int execl
int execlp
int execle
int execv
int execvp
int execvpe
#include <sys/types.h>
#include <unistd.h>
#include <studio.h>
int main()
{
printf("execute ln\s");
execl("/bin/ls", "ls", "-l", NULL);
perror("excel is failed\n");
exit(1);
}
execl
첫 번째 인자
: 전체 디렉토리를 포함한 실행 파일의 이름
두 번째, 세 번째 인자
: argv[0] (무조건 실행 파일의 이름), argv[1] >> 띄어 쓸 때마다 argv에 넣는다.
마지막
: 무조건 NULL
int main(int argc, int *argv[])에서
argc = 해당 실행파일의 인자 개수
argv[] = 각각의 인자를 넣는 배열
perror >> 에러 출력
exit(1) >> 에러 코드 전달
execl >> 첫 번째 인자 디렉토리까지
execlp >> 첫 번째 인자 파일명
execle >> 환경변수 지정, 첫 번째 인자 파일명, 마지막 인자는 envp
execv >> 인자를 변수로 만들 수 있다.
'computer' 카테고리의 다른 글
프로세스 생성: copy on write (0) | 2021.07.06 |
---|---|
프로세스 생성: wait() (0) | 2021.07.05 |
프로세스 ID 시스템 콜 (0) | 2021.07.05 |
프로세스 ID (0) | 2021.07.05 |
ABI와 표준 (0) | 2021.07.03 |
댓글