본문 바로가기
한국으로/임베디드 리눅스

2.1 프로세스

by 영킴. 2018. 6. 27.

2.1 프로세스

2.1.1 개요

프로세스는 현재 실행중인 하나의 프로그램

리눅스는 멀티태스킹이 가능한 운영체제이므로 동시에 여러 개의 프로세스를 실행할 수 있다.
ps 명령으로 현재 프로세스 목록을 확인해보자.
[프로세스를 실행한 유저의 ID] [PID] [PPID] [COMMAND] 정보가 출력된다.

<Default PID>
PID 0 : 커널
PID 1 : init
PID 2 : kthreadd

init은 일반 프로세스들의 조상, kthreadd는 커널 스레드로써 모든 커널 스레드의 부모가 된다.



프로세스마다 왼쪽 가상메모리 공간이 따로 존재한다.

프로세스의 주소공간은 세그먼트 블럭으로 나뉘어져 있다.

"프로세스는 혼자서 가상메모리 공간을 다 사용한다고 생각한다"




2.1.2 프로세스 생성

int system(const char* command);

기능

 /bin/sh -c command를 실행하는 것과 동일. 실행 후 명령이 종료될 때까지 sleep하면서 기다림.

리턴 

 자식 생성 실패 시 -1 리턴

 command 가 NULL 이면 /bin/sh 존재 시 0, 존재하지 않을 시 0 이외의 값 리턴

 그 이외의 경우 /bin/sh 의 종료 상태 (0x????, exit code (8비트) + 시그널번호 (8비트) ) 리턴

 /bin/sh 이 없거나 command 가 정상 실행될 수 없다면 exit code = 0x7f

 command 가 정상적으로 실행되면 exit code 는 command를 따른다

command 

 쉘에서 실행할 명령

예시 

 ret = system("ls -l");



int execl(const char* path, const char* arg, ...);

int execlp(const char* file, const char* arg, ...);

기능 

 현재 프로세스를 새로운 프로세스로 교체

리턴 

 에러 발생 시 errno 설정 후 -1 리턴, 성공 시 리턴 없음 

path 

 교체 실행될 프로그램의 경로 (절대 경로, 상대 경로) 

file 

 교체 실행될 프로그램의 이름 

arg 

 교체되어 실행될 프로그램에 전달될 인자 (2개 이상 가능, 반드시 NULL로 끝나야 함) 

예시 

 ret = execl("/bin/ls", "ls", "-l", NULL); 



pid_t fork(void);

기능 

 자신을 복제하여 자식 프로세스 생성

리턴 

 성공 시 부모 프로세스는 자식 프로세스의 PID, 자식 프로세스는 0 리턴

 실패 시 부모 프로세스는 errno 설정 후 -1 리턴

 실패 시 자식 프로세스는 생성되지 않음 


자식 프로세스는 고유 PID를 가진다.
자식 프로세스의 PPID == 부모 프로세스의 PID
Both processes are simultaneously executed after the fork();



pid_t wait(int* status);

기능 

 자식 프로세스 중 아무나 종료되기를 기다림 

리턴 

 성공 시 종료된 자식 프로세스의 PID, 실패 시 errno  설정 후 -1 리턴 

status

 NULL이 아니면 status가 가리키는 곳에 종료 상태가 저장됨 


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

기능

 특정 PID를 가진 자식 프로세스의 종료를 기다림

리턴 

 성공 시 종료된 자식 프로세스의 PID, 실패 시 errno 설정 후 -1 리턴

 WNOHANG 옵션의 경우 자식  프로세스가 종료되지 않은 경우 0 리턴 

pid 

 정수값 : 종료를 기다리는 자식의 PID값

 -1 : 자식 프로세스 중 아무자 종료되기를 기다림

 -1 미만 : PGID의 음수값 (절대값이 프로세스 그룹 ID라는 뜻) 해당 그룹의 자식 프로세스의 종료를 기다림

options

 WNOHANG : 자식 프로세스의 종료를 기다리지 않고 즉시 리턴
 옵션이 없다면 디폴트값으로 잠이 든다 




좀비 상태 : 자식 프로세스 종료 후 부모 프로세스가 no wait();

부모 프로세스가 wait() 을 콜할 때 자식이 진짜 종료됨.
자식 프로세스 종료 후 실질적으로 종료되지 않은 상태라면 시스템 자원을 낭비하는 것.


양자 상태 : 자식 프로세스보다 부모가 먼저 종료

부모가 먼저 종료되면 자식의 부모 프로세스는 자동적으로 init 이 됨.



'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

3.3 공유 메모리  (0) 2018.06.27
3.2 세마포어  (0) 2018.06.27
3.1 파이프  (0) 2018.06.27
2.2 시그널  (0) 2018.06.27
1.6 파일 입출력  (0) 2018.06.27
1.5 응용 프로그램  (0) 2018.06.26
1.4 개발환경 구축  (0) 2018.06.26
1.3 vi/vim editor  (0) 2018.06.26