프로그램 실행 - system
- 명령 실행하기 위해 쉘까지 동작시켜서 비효율적임
#include <stdlib.h>
int system(const char *string);
int main(){
int a;
a = system("ps -ef | grep han > han.txt"); //system 안의 명령어 실행하고 0 반환
//모든 실행중인 process 중 han grep해서 나열한걸 han.txt에 저장
printf("Return Value : %d\n",a);
}
프로세스 생성 - fork
- 일반적으로 exec와 같이 사용
- parent는 다 한 후에 반드시 wait 해야함
- 새로운 프로세스 생성함 - 자식 프로세스
- fork 함수 호출한 프로세스는 부모 프로세스가 됨
- 자식 프로세스는 부모 프로세스의 메모리 복사함
- RUID, EUID, RGID, EGID, 환경변수
- 열린 파일기술자, 시그널 처리, setuid, setgid
- 현재 작업 디렉토리, umask, 사용가능자원 제한
- 부모 process와 다른점
- parent의 fork return 값: child PID
child의 fork return 값 : 0 - 자식 process는 유일한 PID와 PPID 가짐
- 부모 process가 설정한 프로세스잠금, 파일 잠금, 기타 메모리 잠금은 상속 안함
- 자식 process의 tms 구조체 값은 0으로 설정됨
- parent의 fork return 값: child PID
- 부모 process와 자식 process는 열린 파일을 공유해서 읽기/쓰기 할 때 주의해야 함
- child는 일단 parent를 copy, fork 다음 줄부터 수행됨 (PC가 가리키는 곳부터)
- child의 작업이 끝날 때 parent는 wait하고 있어야 함
-> 이때 wait하지 않는데 child 끝나면 좀비, child 끝나기 전에 부모 먼저 끝나면 고아가 됨 - chlid가 parent와 완전 다른 프로그램 실행하고 싶으면 exec로 실행하기
-> child가 수행 가능한 범위가 늘어남 (융퉁성 ↑)
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void); //pid가 반환됨
//pid<-1 -> error
//pid == 0 -> child
//pid > 0 -> parent
main() {
pid_t pid;
switch (pid = fork()) {
case -1 :
perror("fork");
exit(1);
case 0 : /* child process */
printf("Child Process - My PID: %d, My Parent's PID:%d\n",
(int)getpid(), (int)getppid());
break;
default : /* parent process */
printf("Parent process - My PID:%d, My Parent's PID:%d, "
"My CHild's PID:%d\n", (int)getpid(), (int)getppid(), (int)pid);
break;
}
printf("End of fork\n");
}
프로세스 종료 함수
#include <stdlib.h>
#inlcude <unistd.h>
void exit(int status); //종료 상태값
int atexit(void (*func)(void)); //종료시 수행할 작업 예약
void _exit(int status); //일반적으로 프로그램에서 직접 사용 X, exit 함수 내부적으로 호출함
좀비, 고아, init 프로세스
- 좀비 프로세스 (zombie process)
- 부모 process가 wait 수행x 상태에서 자식이 종료
-> 자식의 종료를 부모가 처리 안해주면 자식은 좀비가 됨
CPU, memory 등의 자원 사용 x, 커널의 작업 리스트에 남아있음
- 부모 process가 wait 수행x 상태에서 자식이 종료
- 고아 프로세스 (orphan process)
- 하나 이상의 자식 process가 수행 중인 상태에서 부모가 먼저 종료됨
== 부모가 자식 기다리지 않고 먼저 종료
- 하나 이상의 자식 process가 수행 중인 상태에서 부모가 먼저 종료됨
- init 프로세스
- 시스템의 init 프로세스가 좀비, 고아 프로세스의 새로운 부모가 됨