๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

TIL (Today I Learned)/Linux

[Linux] ์›น ์„œ๋ฒ„ ๊ตฌํ˜„

728x90

HTTP

์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ HTML ๋ฌธ์„œ ๋“ฑ์„ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด์„œ HTTP ํ”„๋กœํ† ์ฝœ์˜ ๊ทœ์•ฝ์— ๋”ฐ๋ผ HTML ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์›น์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์„ ๋ถ„์„ํ•œ ํ›„ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ํ•ด๋‹นํ•˜๋Š” HTML ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‘๋‹ตํ•œ๋‹ค.
์›น ๋ธŒ๋ผ์•„์ €๋Š” ์›น ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTML ๋ฌธ์„œ๋ฅผ ํ•ด์„ํ•ด์„œ GUI๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.
image

์ถœ์ฒ˜ ์›น์˜ ๊ตฌ๋™์›๋ฆฌ

  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” URL(Uniform Resource Locator)์— ๋ช…์‹œ๋œ ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค. ์—ฐ๊ฒฐํ•  ์„œ๋ฒ„์˜ ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํฌํŠธ๋กœ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 80๋ฒˆ ํฌํŠธ๋กœ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ๋‹ค.

  • ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ์‚ฌ์ด์— ํ†ต์‹  ์ฑ„๋„์ด ์—ฐ๊ฒฐ๋˜๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ HTTP ๊ทœ์•ฝ์„ ๋”ฐ๋ฅด๋Š” ์š”์ฒญ ๋ฉ”์‹œ์ง€(Request Message)๋ฅผ ์ƒ์„ฑํ•ด์„œ ์›น ์„œ๋ฒ„๋กœ ์ „์†กํ•œ๋‹ค. ์š”์ฒญ ๋ฉ”์‹œ์ง€๋Š” ์š”์ฒญ๋ผ์ธ, ์š”์ฒญ ํ—ค๋”, ๋ฐ”๋”” ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ

  • ์›น ์„œ๋ฒ„๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„์„ํ•˜๊ณ  ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ฐพ๋Š”๋‹ค. HTTP ๊ทœ์•ฝ์— ๋ถ€ํ•ฉํ•˜๋Š” ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „์†กํ•œ๋‹ค. ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” ์ƒํƒœ๋ผ์ธ, ์‘๋‹ต ํ—ค๋”, ๋ฐ”๋”” ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‘๋‹ต ํ—ค๋”๋Š” ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€, ์ „์†กํ•  ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์‘๋‹ต ํ—ค๋”์— ์ด์–ด์„œ ์ „์†กํ•œ๋‹ค.

  • ์›น ์„œ๋ฒ„๋Š” ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ ์งํ›„, ๊ฐ•์ œ๋กœ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•œ๋‹ค.

  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ์ „์†กํ•œ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„์„ํ•ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.

  • ๋งŒ์ผ ์›น ์„œ๋ฒ„๊ฐ€ ์ „์†กํ•œ ์‘๋‹ต ๋ฉ”์‹œ์ง€์— ๋‹ค์Œ๊ณ  ๊ฐ™์ด ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ฐธ์กฐ๊ฐ€ ์žˆ์œผ๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์— ๋‹ค์‹œ ์š”์ฒญํ•ด์„œ ์ด ํŒŒ์ผ์„ ๋ฐ›์•„ ์˜จ๋‹ค. ์ด๋•Œ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์›น ์„œ๋ฒ„๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๊ฒŒ ๋˜๊ณ , ๋ฐ›์€ ๋‹ค์Œ์—์•ผ ๋น„๋กœ์„œ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

  • ex) <img src ="image.jpg">

    • HTML ๋ฌธ์„œ์— 10๊ฐœ์˜ ํƒœ๊ทธ๊ฐ€ ์žˆ๋‹ค๋ฉด, HTML ๋ฌธ์„œ์— ๋Œ€ํ•œ ์š”์ฒญ 1ํšŒ, ์ด๋ฏธ์ง€ ํŒŒ์ผ์— ๋Œ€ํ•œ ์š”์ฒญ 10ํšŒ๋ฅผ ํฌํ•จ, ์ด 11ํšŒ ์›น ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•ด์„œ ํŒŒ์ผ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ๋งŒ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํŒŒ์ผ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ๊ณผ ์ž๋ฃŒ ์†ก์ˆ˜์‹ ์„ ํŠธ๋žœ์žญ์…˜์ด๋ผ ํ•˜๋Š”๋ฐ, ์˜ˆ์—์„œ ์ด 11ํšŒ์˜ ํŠธ๋žœ์žญ์…˜์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
      image

    ์›น ์„œ๋ฒ„์˜ ๊ตฌํ˜„

    • ์„œ๋ฒ„๋Š” GET ๋ฐฉ์‹์˜ ์š”์ฒญ๋งŒ์„ ์ฒ˜๋ฆฌ
    • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์˜ ํŒŒ์ผ์— ๋Œ€ํ•ด ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต
    • ์ •์  ์›น ํŽ˜์ด์ง€(html, htm), ์ด๋ฏธ์ง€ ํŒŒ์ผ(gif, png, jpg, jpeg), ์••์ถ• ์ด์ง„ ํŒŒ์ผ์ด๋‚˜ ์•„์นด์ด๋ธŒ(zip, gz, tar)

ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„ ๊ณผ์ •

image

  • 1 ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์•„ํŒŒ์น˜ ์›น ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•œ๋‹ค. HTTP ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์›น ์„œ๋ฒ„๋กœ index.html ํŒŒ์ผ์„ ์š”์ฒญํ•˜๊ณ , ์ด๋ฅผ ๋ฐ›์•„ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •
    • url : http//127.0.0.1/index.html
  • 2 ์›น ๋ธŒ๋ผ์šฐ์ € ๋Œ€์‹ ์— ์‰˜์ƒ์—์„œ telnet ๋ช…๋ น์œผ๋กœ ์•„ํŒŒ์น˜ ์›น ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ , http ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์›น ์„œ๋ฒ„๋กœ index.html ํŒŒ์ผ์„ ์š”์ฒญํ•˜๊ณ , ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๊ด€์ฐฐํ•œ๋‹ค.
    • $ telnet 127.0.9.1 80
    • GET / index.html HTTP/1.0
  • 3 HTTP ๊ทœ์•ฝ์œผ๋กœ ์›น ์„œ๋ฒ„์— ์›น ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•˜๋Š” ์›น ํ”„๋กœ๊ทธ๋žจ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ , ์•„ํŒŒ์น˜ ์›น ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด์„œ ์›น ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›๋Š” ๊ณผ์ •์„ ๊ด€์ฐฐ
  • 4 HTTP ๊ทœ์•ฝ์— ๋”ฐ๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์›น ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ 9000๋ฒˆ ํฌํŠธ์— ์—ฐ๊ฒฐํ•ด์„œ ์‹คํ–‰ ํ›„, ์›น ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ์ œ๋Œ€๋กœ ๊ตฌ๋™๋˜๋Š”์ง€ ์‰˜์ƒ์—์„œ telnet ๋ช…๋ น์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค.
  • 5 ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•œ ์›น ํด๋ผ์ด์–ธํŠธ์™€ ์›น ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ HTTP ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์›น ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๊ด€์ฐฐ
  • 6 ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•œ ์›น ์„œ๋ฒ„๋กœ HTTP ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ๊ด€์ฐฐ

$ yum install httpd ๋กœ ์„ค์น˜

ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ

  • ์›น ์„œ๋ฒ„์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ServerRoot์— ์„ค์ •๋˜์–ด ์žˆ๋‹ค. grep ๋ช…๋ น์–ด๋ฅผ ์ด์š”ํ•˜์—ฌ ServerRoot๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    image
  • ์›น ์„œ๋ฒ„์˜ Listen ํฌํŠธ๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์„œ ํŒŒ์ผ์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ

image

ํ…”๋„ท์„ ์ด์šฉํ•˜์—ฌ ์•„ํŒŒ์น˜ ์›น ์„œ๋ฒ„์— ์›น ๋ฌธ์„œ ์š”์ฒญ

  • ํ…”๋„ท์œผ๋กœ 127.0.0.1์˜ 80๋ฒˆ ํฌํŠธ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ , HTTP ๊ทœ์•ฝ์— ๋”ฐ๋ผ GET /inde.html HTTP/1.0\r\n\r\n๊ณผ ๊ฐ™์€ ๋ฌธ์„œ ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ์›น์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋ฉด ์›น์„œ๋ฒ„๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ DocumentRoot์— ์„ค์ •๋œ ๋ฌธ์„œ ํŒŒ์ผ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ํ•ด๋‹น ํŒŒ์ผ ๋ฌธ์„œ(/usr/local/apache/htdocs/index.html)๋ฅผ ์ฝ์–ด์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค.
  • telnet ๋ช…๋ น์œผ๋กœ ์•„ํŒŒ์น˜ ์›น ์„œ๋ฒ„์— HTML ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•œ ๊ฒฐ๊ณผ
    image
    image
webServer.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/resource.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/stat.h>

#define LOG 100
#define ERROR 200

#define CODE200 200
#define CODE404 404

#define PHRASE200 "OK"
#define PHRASE404 "FILE NOT FOUND"

char documentRoot[ ] = "/etc/httpd/htdocs";

void do_web(int);
void web_log(int, char[ ], char[ ], int);

int log_fd;

int
main(int argc, char *argv[ ]) {
        struct sockaddr_in s_addr, c_addr;
        int     s_sock, c_sock;
        int     len, len_out;
        unsigned short port;
        int     status;
        struct rlimit resourceLimit;
        int     i;

        int     pid;

        if(argc != 2){
                printf("usage: webServer port_number");
                return -1;
        }

        if(fork( ) != 0)
                return 0;                               // parent return to shell

        (void)signal(SIGCLD, SIG_IGN);          // ignore child death
        (void)signal(SIGHUP, SIG_IGN);          // ignore terminal hangup

        resourceLimit.rlim_max = 0;
        status = getrlimit(RLIMIT_NOFILE, &resourceLimit);
        for(i = 0; i < resourceLimit.rlim_max; i++) {
                close(i);
        }

        web_log(LOG, "STATUS", "web server start", getpid( ));

        if((s_sock=socket(PF_INET, SOCK_STREAM, 0))<0){
                web_log(ERROR, "SYSCALL", "web server listen sockek open error", s_sock);
        }

        port=atoi(argv[1]);
        if(port > 60000)
                web_log(ERROR, "ERROR", "invalid port number", port);

        memset(&s_addr, 0, sizeof(s_addr));
        s_addr.sin_family = AF_INET;
        s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        s_addr.sin_port = htons(port);

        if(bind(s_sock, (struct sockaddr *) &s_addr, sizeof(s_addr)) <0)
                web_log(ERROR, "ERROR", "server cannot bind", 0);

        listen(s_sock, 10);

        while(1){
                len = sizeof(c_addr);
                if((c_sock = accept(s_sock, (struct sockaddr *) &c_addr, &len)) < 0)
                        web_log(ERROR, "ERROR", "server accept error", 0);

                if((pid = fork( )) < 0) {
                        web_log(ERROR, "ERROR", "server fork error", 0);
                } else if(pid == 0) {
                        close(s_sock);
                        do_web(c_sock);
                } else {
                        close(c_sock);
                }
        }
}

void
do_web(int c_sock)
{
        char    sndBuf[BUFSIZ+1], rcvBuf[BUFSIZ+1];
        char    uri[100], c_type[20];;
        int     len;

        int     len_out;
        int     n, i;
        char    *p;
        char    method[10], f_name[20];
        char    phrase[20] = "OK";

        int     code = 200;
        int     fd;                     // file discriptor

        char    file_name[20];
        char    ext[20];

        struct stat sbuf;

        struct {
                char *ext;
                char *filetype;
        } extensions [ ] = {
                {"gif", "image/gif" },
                {"jpg", "image/jpeg"},
                {"jpeg","image/jpeg"},
                {"png", "image/png" },
                {"zip", "image/zip" },
                {"gz",  "image/gz"  },
                {"tar", "image/tar" },
                {"htm", "text/html" },
                {"html","text/html" },
                {0,0} };

        memset(rcvBuf, 0, sizeof(rcvBuf));
                if((n = read(c_sock, rcvBuf, BUFSIZ)) <= 0)
                        web_log(ERROR, "ERROR", "can not receive data from web browser", n);

                web_log(LOG, "REQUEST", rcvBuf, n);

                p = strtok(rcvBuf, " ");
                if(strcmp(p, "GET") && strcmp(p, "get"))
                        web_log(ERROR, "ERROR", "Only get method can support", 0);

                p = strtok(NULL, " ");
                if(!strcmp(p, "/"))
                sprintf(uri, "%s/index.html", documentRoot);
                else
                        sprintf(uri, "%s%s", documentRoot, p);

                strcpy(c_type,  "text/plain");
                for(i=0; extensions[i].ext != 0; i++) {
                        len = strlen(extensions[i].ext);
                        if( !strncmp(uri+strlen(uri)-len, extensions[i].ext, len) ) {
                                strcpy(c_type, extensions[i].filetype);
                                break;
                        }
                }

                if((fd = open(uri, O_RDONLY)) < 0) {
                        code = CODE404;
                        strcpy(phrase, PHRASE404);
                }

                p = strtok(NULL, "\r\n ");              // version

                                                        // send Header
                sprintf(sndBuf, "HTTP/1.0 %d %s\r\n", code, phrase);
                n = write(c_sock, sndBuf, strlen(sndBuf));
                web_log(LOG, "RESPONSE", sndBuf, getpid( ));

                sprintf(sndBuf, "content-type: %s\r\n\r\n", c_type);
                n = write(c_sock, sndBuf, strlen(sndBuf));
                web_log(LOG, "RESPONSE", sndBuf, getpid( ));

                if(fd >=0 ) {
                        while((n = read(fd, rcvBuf, BUFSIZ)) > 0) {
                                write(c_sock, rcvBuf, n);
                        }
                }

                close(c_sock);
                exit(-1);
        }

        void
        web_log(int type, char s1[ ], char s2[ ], int n)
        {
                int     log_fd;
                char    buf[BUFSIZ];

                if(type == LOG) {
                        sprintf(buf, "STATUS %s %s %d\n", s1, s2, n);
                } else if(type == ERROR) {
                        sprintf(buf, "ERROR %s %s %d\n", s1, s2, n);
                }

                if((log_fd = open("web.log", O_CREAT|O_WRONLY|O_APPEND, 0644)) >= 0) {
                        write(log_fd, buf, strlen(buf));
                        close(log_fd);
                }

                if(type == ERROR) exit(-1);

        }
webClient.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define BUF_LEN 128


int main(int argc, char *argv[ ])
{
        int s, n, len_in, len_out;
        struct sockaddr_in server_addr;
        char *haddr;
        char buf[BUF_LEN+1];
        int port;

        if(argc==3) {
                port=80;
        } else if(argc==4) {
                port=atoi(argv[3]);
        } else {
                printf("usage : webClient server_addr URL [port_number]");
                return -1;
        }

        haddr=argv[1];
        if((s=socket(PF_INET, SOCK_STREAM, 0)) < 0) {
                printf("can not create socket\n");
                return -1;
        }

        memset(&server_addr, 0, sizeof(server_addr));
        server_addr.sin_family=AF_INET;
        server_addr.sin_addr.s_addr=inet_addr(haddr);
        server_addr.sin_port=htons(port);

        if(connect(s, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
                printf("can not connect");
                return -1;
        }

        sprintf(buf, "GET %s HTTP/1.0\r\n\r\n",  argv[2]);
        write(s, buf, strlen(buf));

        memset(buf, 0, sizeof(buf));
        while((n = read(s, buf, BUF_LEN)) > 0) {
                printf("%s", buf);
                memset(buf, 0, sizeof(buf));
        }

        close(s);
}

[์ถœ์ฒ˜] ์ •์„์šฉ์˜ tcp/ip ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ | ํ”„๋กœ์ ํŠธ - ์›น ์„œ๋ฒ„

'TIL (Today I Learned) > Linux' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Linux] pthread join๊ณผ detach  (0) 2021.09.03
[Linux]Symbolic/Hard link  (0) 2021.08.31
[Linux] Shell์˜ ๊ฐœ๋…  (0) 2021.08.30
[Linux] ํ™˜๊ฒฝ๋ณ€์ˆ˜  (0) 2021.08.27
[Linux] make์™€ Makefile  (0) 2021.08.25