본문 바로가기
2022-2/시스템 프로그래밍

8장 프로세스

by 철없는민물장어 2022. 11. 8.
728x90
반응형
8.1 프로그램 시작

사용자가 프로그램을 실행하면 내부적으로(shell 내에서) fork(), exec()시스템 호출을 통해 새로운 프로그램이 실행 됨

 

C 시작 루틴(start-up routine)

컴파일러가 실행 파일에 C 시작루틴을 포함시킴. 

이 루틴은 exec로부터 전달받은 명령줄 인수, 환경 변수를 main함수로 전달함.

 

프로그램 실행 종료

main함수의 실행이 끝나면

exit( main(argc,argv)); 을 호출

(main에서 return 0-> exit(0))


명령줄 인수

int main(int argc, char *argv[]);

argc: 명령줄 인수의 개수

argv[]: 명령줄 인수 리스트를 나타내는 포인터 배열

 

더보기
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    int i;
    for(i=0;i<argc;i++){
        printf("argv[%d]: %s \n",i,argv[i]);
    }
    exit(0);
}

환경 변수

쉘이 가지고 있던 환경 변수를 쉘이 새로운 프로그램을 실행시킬 때, 그 프로그램에게 넘겨 준다.

전역 변수 environ을 통해 char *environ[] 형태로 전달 받음.

#include <stdio.h>

int main(int argc, char *argv[])
{
	char **ptr;
    extern char **environ; //외부 변수
    
    for(ptr=environ; *ptr!=0; ptr++)
    	printf("%s \n", *ptr);
        
    exit(0);
}

 

특정한 환경 변수 접근 방법

#include <stdlib.h>

char *getenv(const char *name);
//환경변수 name의 값을 반환한다. 해당 변수가 없으면 NULL을 반환한다.

 


8.2 프로그램 종료

정상종료시 main함수의 리턴값을 가지고 exit()호출.

(혹은 프로그램 내에서 직접 exit() 혹은 _exit()을 호출)

 

비정상종료시 abort()시스템호출을 통해 종료.(잘못된 메모리 영역 참조, 잘못된 권한설정 등)

 

exit()

모든 열려진 스트림을 닫고(fclose), 출력 버퍼의 내용을 디스크에 쓰고(fflush)난 후 프로세스를 종료.

#include <stdlib.h>

void exit(int status);

 

_exit()

뒷정리를 하지않고 프로세스를 즉시 종료시킴.

 

atexit()

 

#include <stdlib.h>

void atexit(void (*func)(void));

기본적인 exit함수의 일(fclose,fflush)이외에 추가적으로 사용자가 원하는 후처리 작업 등록 가능.(최대32개)

exit()는 exit handler들을 등록된 역순으로 호출함.

 

#include <stdio.h>
static void exit_handler1(void), exit_handler2(void);

int main(void)
{
	if(atexit(exit_handler1)!=0)
    	perror("등록불가");
    if(atexit(exit_handler2)!=0)
    	perror("등록불가");
    printf("main끝\n");
    exit(0);
}

static void exit_handler1(void)
{
	printf("처리기1");
}
static void exit_handler2(void)
{
	printf("처리기2");
}

8.3 프로세스 ID
int getpid(); //PID 리턴
int getppid(); //부모 PID 리턴

 

 프로세스의 사용자ID 확인

#include <sys/types.h>
#include <unistd.h>

uid_t getuid();//프로세스의 실제 사용자ID 반환
uid_t geteuid();//프로세스의 유효 사용자ID 반환
uid_t getgid();//실제 그룹ID
uid_t getegid();//유효 그룹ID

 

프로세스의 사용자ID 변경

#include <sys/types.h>
#include <unistd.h>

uid_t setuid(uid_t uid);//프로세스의 실제 사용자ID 변경
uid_t seteuid(uid_t uid);//프로세스의 유효 사용자ID 변경
uid_t setgid(gid_t gid);//실제 그룹ID
uid_t setegid(gid_t gid);//유효 그룹ID

 


8.4 프로세스 구조

프로그램 실행을 위해서는

  • 코드
  • 데이터
  • 스택
  • 힙영역

등이 필요하다.

 

$ size [실행파일]
//실행파일의 각 영역의 크기를 알려준다. 실행파일 지정하지 않을 시 a.out을 대상으로 함

 

프로세스 구조

 

코드 혹은 텍스트: 프로세스가 실행하는 실행코드를 저장하는 영역.

 

데이터: 전역 변수 및 정적(static) 변수를 위한 메모리 영역

 

: 동적 메모리 할당을 위한 영역. malloc 호출시 이 영역에서 메모리 할당해줌

 

스택: 함수 호출을 구현하기 위한 실행시간 스택을 위한 영역. 지역변수,매개변수,리턴 주소, 반환 값 등 저장

 

 

728x90
반응형

'2022-2 > 시스템 프로그래밍' 카테고리의 다른 글

9장 프로세스 제어  (1) 2022.11.16
10장 메모리 관리  (0) 2022.11.11
5. 파일 시스템  (0) 2022.11.02
4장 파일 입출력  (0) 2022.10.30
gdb 디버거  (3) 2022.10.14

댓글