get_next_line
๐Ÿ™ˆ

get_next_line

Created
Feb 7, 2023 08:31 AM
Last edited time
Last updated January 23, 2024
Tags
42
Language
C
URL
ย 
  • ํŒŒ์ผ๋””์Šคํฌ๋ฆฝํ„ฐ fd 0 ํ‘œ์ค€์ž…๋ ฅ 1 ํ‘œ์ค€์ถœ๋ ฅ 2 ํ‘œ์ค€์—๋Ÿฌ ์ž„์˜๋กœ ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ด๋ฉด 3๋ฒˆ๋ถ€ํ„ฐ ๋ฐฐ์ •๋ฐ›๋Š”๋‹ค.
static varible(์ •์  ๋ณ€์ˆ˜)
static ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๋‚ด๋ถ€์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ „์—ญ์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํŠน์ดํ•˜๊ฒŒ๋„ static๋ณ€์ˆ˜๋Š” ํ† ๊ธฐํ™” ํ•˜์ง€ ์•Š์•„๋„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. static ๋ณ€์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋ ๋•Œ ํ• ๋‹น๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚ ๋•Œ ํŒŒ๊ดด๋œ๋‹ค. ์ „์—ญ static ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๊ทธ ์†Œ์ŠคํŒŒ์ผ ๋‚ด์˜ ๋ชจ๋“  ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ์„ ํ•˜๊ฒŒ๋˜๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ๋Š” ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ๋‚ด๋ถ€์ •์ ๋ณ€์ˆ˜๋ผ ํ•˜๋Š”๋ฐ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋ ๋•Œ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด์ง€๊ณ  ๋ฐ˜๋ณต์‹คํ–‰๋œ๋‹คํ•˜์—ฌ๋„ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‚ด๋ถ€ ์ •์ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ์ค‘๊ด„ํ˜ธ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์ ์ธ ์ ‘๊ทผ์— ์–ด๋ ค์›€์ด ์žˆ๋‹ค.
  • read ํ•จ์ˆ˜
    • ํ—ค๋”: unistd.h
    • ํ˜•ํƒœ: ssize_t read (intย fd,ย voidย *buf, size_t nbytes)
    • ์ธ์ˆ˜:ย intย fd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐvoidย *buf ํŒŒ์ผ์„ ์ฝ์–ด ๋“ค์ผ ๋ฒ„ํผsize_t nbytes ํผ๋ฒ„์˜ ํฌ๊ธฐ
    • ๋ฐ˜ํ™˜: ssize_t == -1 ์‹คํŒจ>ย 0 ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด ์ฝ์–ด๋“ค์ธ ๋ฐ”์ดํŠธ ์ˆ˜
    • ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํŒŒ์ผ์ด ํฌ๋ฉด ์—ฌ๋Ÿฌ๋ฒˆ ์ฝ์–ด์˜ฌ์ˆ˜์žˆ๋Š”๋ฐ read ํ•จ์ˆ˜๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ด์ „์— ์ฝ์€๋ถ€๋ถ„ ์ดํ›„๋ฅผ ๋ฒ„ํผ์— ๋‹ด์•„์ค€๋‹ค.
      #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include "./get_next_line/get_next_line.h" int main() { int fd; static t_gnl_list *head; char *buf; if ( 0 < ( fd = open( "./txt1.txt", O_RDONLY))){//12345๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ printf("%zd || %s\n",read( fd, buf, 2),buf);// 2 || 12 printf("%zd || %s\n",read( fd, buf, 2),buf);// 2 || 34 printf("%zd || %s\n",read( fd, buf, 2),buf);// 1 || 54 // ์ฝ์€ ๋ฐ”์ดํŠธ์ˆ˜๊ฐ€ ๋ฒ„ํผ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋๊นŒ์ง€ ์ฝ์€ ๊ฒƒ์ด๊ณ , buf+๋ฐ”์ดํŠธ์ˆ˜ -1 ๊นŒ์ง€ ๋ฒ„ํผ์— ๋‹ด๊ธด๊ฒƒ์ด๋‹ค. printf("%zd || %s\n",read( fd, buf, 2),buf);// 0 || 54 close( fd); } else { printf( "ํŒŒ์ผ ์—ด๊ธฐ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.\n"); } return 0; }
  • open
    • open (const char *FILENAME, int FLAGS[, mode_t MODE])
      ํŒŒ์ผ ์ด๋ฆ„๊ณผ ํŒŒ์ผ์— ๋Œ€ํ•œ ์—ด๊ธฐ ์˜ต์…˜์„ ์ฃผ๊ฒŒ ๋˜๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์–‘์˜ ์ •์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•˜๊ฒŒ ๋œ๋‹ค.
      #์ด ๋•Œ ํŠน์ดํ•˜๊ฒŒ๋„ ๊ฐ™์€ ํŒŒ์ผ์„ ๋‘๋ฒˆ ์—ด๋ฉด ๊ฐ™์€ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
      #๊ตฌํ˜„์‹œ ์ฃผ์˜ํ• ์ ๋“ค# - ๊ฐœํ–‰์ „๊นŒ์ง€ ํƒ์ƒ‰ํ›„ ์ถœ๋ ฅ(ํ•ด๋‹น fd์˜ backup์— ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๋ฉด ๊ฐœํ–‰์ „๊นŒ์ง€ ์ถœ๋ ฅ) ๊ฒฝ์šฐ์˜ ์ˆ˜ backup ๋น„์–ด์žˆ์„๋•Œ : readํ•œ ๊ฐ’์—์„œ ๊ฐœํ–‰์ „๊นŒ์ง€ ๊ฐ’์„ ์ €์žฅ, ์ดํ›„๊ฐ’์€ ํ•ด๋‹น fd๋…ธ๋“œ backup์— ์ €์žฅ, ๊ฐœํ–‰์ „๊นŒ์ง€ ์ €์žฅํ•œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ถœ๋ ฅ backup ์ฐจ์žˆ์„๋•Œ : backup์—์„œ ๊ฐœํ–‰์ „๊นŒ์ง€ ๋ฐ›์•„์˜ด, ๋งŒ์•ฝ ๊ฐœํ–‰์ด ์กด์žฌํ–ˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ›„ readํ•œ๊ฐ’ ๋’ค์— ๋ถ™์—ฌ์ฃผ๊ธฐ, ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด backup + readํ•œ ๊ฐ’์— ๊ฐœํ–‰์ด ์žˆ์„๊ฒฝ์šฐ๋ฅผ ํŒ๋ณ„ํ›„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ถœ๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ + ์ €์žฅ ๋‚จ์€ ๋ถ€๋ถ„ ํ•ด๋‹น fd๋…ธ๋“œ์˜ backup์— ์ €์žฅ
  • ์ฃผ์˜ํ•œ์ ๋“ค 1. malloc ์„ ํ•˜๊ณ  strlcat์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ malloc์„ ํ•œ ๊ฐ’์—๋Š” ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋“ค์–ด์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋งจ์ฒ˜์Œ ๊ฐ’์— โ€˜\0โ€™์„ ๋„ฃ์–ด์ฃผ๋Š” ํŽธ์ด ์ข‹๋‹ค. ๋˜ํ•œ ํ• ๋‹นํ•œ ๋ถ€๋ถ„ ๋„˜์–ด์„œ ๊นŒ์ง€ ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์กฐ์‹ฌํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋งŒ์•ฝ ํ• ๋‹นํ•œ ๋ถ€๋ถ„์„ ๋„˜์–ด์„œ ์ฐธ์กฐ๋ฅผ ํ•˜๋ฉด heap overflow๋ผ๋˜์ง€ stack overflow ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!!
main๋ฌธ
#include <fcntl.h> #include <stdio.h> int main() { int fd; int num = 43; fd = open("files/41_no_nl",O_RDONLY); for(int i=1;i<=num;i++) printf("num:%d ---->|%s|\n",i,get_next_line(fd)); }

Loading Comments...