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 호출시 이 영역에서 메모리 할당해줌
스택: 함수 호출을 구현하기 위한 실행시간 스택을 위한 영역. 지역변수,매개변수,리턴 주소, 반환 값 등 저장
'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 |
댓글