System Programming Ch7 - Ch8
๐กย Chap_7
Memory Layout of a C Program
โ๏ธ 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 ๋ช ๋ น์ด๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ์์ ์คํ์์ผ์ฃผ๋ ํจ์