Contents

System Programming Ch7 - Ch8

   Dec 9, 2022     4 min read

๐Ÿ’กย Chap_7

Memory Layout of a C Program

memory layout

โ˜๏ธ Memory Layout (๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ)

  • high address : ์ปค๋„์ด ์žˆ์Œ
  • stack : ์ปค๋„์„ ์นจ๋ฒˆํ•˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์€ ์•„๋ž˜๋กœ๋งŒ ์ž๋ž€๋‹ค. ์ฃผ๋กœ ์ง€์—ญ๋ณ€์ˆ˜(๋ฉ”์†Œ๋“œ ์•ˆ์œผ๋กœ ๊ตญํ•œ๋จ), main ํ•จ์ˆ˜(์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ํ•จ์ˆ˜) ๋‚ด์˜ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ตฌ์กฐ
  • heap : ์Šคํƒ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ์œ„๋กœ๋งŒ ์ž๋žŒ, ์Šคํƒ๊ณผ ํž™์€ ์„œ๋กœ ๋งŒ๋‚˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉด์„œ ์ปค๋„์— ์ ˆ๋Œ€ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ, ๋™์ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ
  • unitialized data & initialized data : ํ•ฉ์ณ์„œ ๋ฐ์ดํ„ฐ ์˜์—ญ
  • text : ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ


Memory Allocation

โ˜๏ธ ๋™์ ํ• ๋‹น๊ณผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜

  • malloc : memory allocation
  • calloc : malloc๊ณผ ์ธ์ž ๋‹ค๋ฆ„(๋‹จ์ˆœํžˆ ์ธ์ž๋งŒ ๋‹ค๋ฅธ๊ฒƒ์€ X)
char* hi (char*)malloc(sizeof(char)*4); //malloc์€ ์„ ์–ธํ•˜๋ฉด ์“ฐ๋ ˆ๊ธฐ๊ฐ’ ๋“ค์–ด๊ฐ
char* aloha (char*)calloc(sizeof(char), 4); //calloc์€ 0์œผ๋กœ ๋‹ค ์ดˆ๊ธฐํ™” ํ•ด์คŒ
  • realloc : retry allocation, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋™์ ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ฑฐ๋‚˜ ์ค„์—ฌ์ฃผ๋Š” ์—ญํ• (์žฌํ• ๋‹น), ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋™์ ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ
  • free : ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜

โ†’ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์•ˆํ•ด์ค€ ๊ฒƒ์ด ์Œ“์ด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊น€, c๋‚˜ c++์€ ์‚ฌ์šฉ์ž๊ฐ€ free๋ฅผ ๊ผญ ํ•ด์ค˜์•ผํ•จ, free ์•ˆํ•ด์ฃผ๊ณ  ๋™์ ํ• ๋‹น์„ ๊ณ„์† ํ•˜๊ณ  ์“ฐ๋ฉด leak, ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • alloca : stack์—๋‹ค๊ฐ€ ๋™์ ํ• ๋‹น์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜, ํ•„์š”ํ•œ ์ด์œ ๋Š” stack์€ ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚˜๋ฉด ์•Œ์•„์„œ free๋ฅผ ํ•ด์ฃผ๋‹ˆ๊นŒ


setjmp and longjmp Function

โ˜๏ธ (์‹œํ—˜๋ฌธ์ œ๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ๊ฐœ๋…, chap_10๊ณผ ์—ฐ๊ด€)

  • setjmp : ๊นƒ๋ฐœ์„ ๊ฝ‚๊ณ 
  • longjmp : longjmp๋ฅผ ๋งŒ๋‚˜๋ฉด setjmp๋กœ ๋Œ์•„๊ฐ
#include "apue.h"
#include <setjmp.h>

jmp_buf jmpbuffer; //jmpbuffer๋Š” ์ง€๊ธˆ status๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Œ, ์ž๋ฃŒํ˜•์€ jmp_buf

int main(void) {
		char line[MAXLINE];
		
		if(setjmp(jmpbuffer) != 0) //setjmpํ•จ์ˆ˜ ๋งŒ๋‚จ, ๊นƒ๋ฐœ์„ ๊ฝ‚์Œ
				printf("error");
		while(fgets(line, MAXLINE, stdin) != NULL)
				do_line(line);
		exit(0);
}

...

void cmd_add(void) {
		int token;
		
		token = get_token();
		if(token < 0)  /* an error has occured */
				longjmp(jmpbuffer,1); //setjmp ์œ„์น˜๋กœ ์ ํ”„ํ•˜๊ฒŒ๋จ, setjmp์˜ ๋ฐ˜ํ™˜๊ฐ’์€ 1
		/* rest of processing for this command */
}


๐Ÿ’กย Chap_8

fork, vfork Function

โ˜๏ธ ํ”ํžˆ ์“ฐ๋Š” ํฌํฌ ์ƒ๊ฐํ•˜๋ฉด ๋จ

  • fork : ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ๋˜‘๊ฐ™์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜, copy-on-write,

    the child is copy of the parent, ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ทธ๋Œ€๋กœ ์นดํ”ผํ•จ โ†’ ์˜ค๋ž˜๊ฑธ๋ฆผ

  • vfork : ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ชจ๋‘๋‹ค ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ผ๋ถ€๋งŒ ๋ณต์‚ฌํ•ด์„œ ์ž์‹ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜


wait and waitpid Function

โ˜๏ธ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์งฌ

#include "apue.h"
#include <sys/wait.h>
int main(void)
{
ย ย  pid_t pid;
ย ย  int status;
ย ย  if ((pid = fork()) < 0) //์—๋Ÿฌ
			err_sys("fork error");
ย ย  else if (pid == 0) // 0์ผ๋•Œ child
ย ย ย ย ย  exit(7);
	 //0๋ณด๋‹ค ํฐ ์–‘์ˆ˜์ผ ๋•Œ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋งŒ ๋ด๋ผ
ย ย  if (wait(&status) != pid) // wait for child, ์ž์‹ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€
ย ย ย ย ย  err_sys("wait error");
ย ย  pr_exit(status); // and print its status

...

}
  • fork ํ•จ์ˆ˜๋กœ ์ž์‹ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด ๊ฐ™์€ ์ฝ”๋“œ ์•ˆ์—์„œ ๋ถ„๊ธฐ๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ๊ธฐ๋Š” ๊ฒƒ์ž„
  • wait(&status), ์ž์‹ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฌผ์–ด๋ณด๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚˜๋ฉด ์ƒํƒœ ๋ฐ˜ํ™˜ํ•ด์คŒ
  • pr_exit(status), status ๊ฐ’์„ ์ฐ์–ด์ฃผ๋Š” ๊ฒƒ


exec Function

โ˜๏ธ (๋‹จ๋‹ตํ˜• ๋‹จ๊ณจ, ์ดํ•ดํ•˜๋ฉด ๋จ)

#include <unistd.h>
int execl(const char *pathname, const char *arg0, โ€ฆ /* (char *) 0 */);
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, โ€ฆ /* (char *) 0, char *const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, โ€ฆ /* (char *) 0 */);
int execvp(const char *filename, char *const argv[]);

exec๋Š” ๋ชจ๋‘ ๋™์ผ, exec๋Š” forkํ•จ์ˆ˜์™€ ์—ฐ๊ณ„๋˜์–ด ๋งŽ์ด ์“ฐ์ด๋Š” ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜

  • execl : list of argument, ์ธ์ž๊ฐ€ ๋ฆฌ์ŠคํŠธ์ธ ์‹คํ–‰ํ•จ์ˆ˜
  • execv : ์ธ์ž๊ฐ€ ๋ฒกํ„ฐ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์‹คํ–‰ํ•จ์ˆ˜
  • execle : ์ธ์ž๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜ํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์‹คํ–‰ํ•จ์ˆ˜
  • execve : ์ธ์ž๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜์™€ ๋ฒกํ„ฐ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์‹คํ–‰ํ•จ์ˆ˜
  • execlp : ์ธ์ž๊ฐ€ ํŒŒ์ผ๋„ค์ž„๊ณผ ๋ณ€์ˆ˜๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์‹คํ–‰ํ•จ์ˆ˜
  • execvp : ์ธ์ž๊ฐ€ ํŒŒ์ผ๋„ค์ž„๊ณผ ๋ฒกํ„ฐ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์‹คํ–‰ํ•จ์ˆ˜


system Fucntion

โ˜๏ธ ์ธ์ž๋กœ ๋„˜์–ด์˜จ shell์—์„œ ์น˜๋Š” ๋ช…๋ น์–ด

  • ํ„ฐ๋ฏธ๋„ ๊ฐ™์€ ์‰˜์—์„œ ์นœ ๋ช…๋ น์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฉ”์†Œ๋“œ
  • shell ๋ช…๋ น์–ด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ›์•„์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜