\documentstyle[lslide,a4wide]{harticle}

\addtolength{\textheight}{-0.5in}
\verttop
\shadowframe

\begin{document}

\title{UNIX È¯°æ¿¡¼­ÀÇ C ÇÁ·Î±×·¡¹Ö II}
\author{¿À ¼º ±Ô}
\organization{SPARCS} 
\date{1993³â 7¿ù 13ÀÏ}
\titlepage

\begin{slide}
\subsection{½ºÆ®¸µ ´Ù·ç´Â ÇÔ¼öµé}
\begin{itemize}

\item{Character Classification}
\begin{large}
\begin{verbatim}
    #include <ctype.h>
\end{verbatim}
\begin{itemize}
\item {\tt isalpha(c) } --- ±ÛÀÚ -- a ¿¡¼­ z ±îÁö ¶Ç´Â A ¿¡¼­ Z ±îÁö 
\item {\tt isupper(c) } --- ´ë¹®ÀÚ -- A ¿¡¼­ Z±îÁö. 
\item {\tt islower(c) } --- ¼Ò¹®ÀÚ -- a ¿¡¼­ z±îÁö. 
\item {\tt isdigit(c) } --- ¼ýÀÚ -- 0 ¿¡¼­ 9 ±îÁö. 
\item {\tt isxdigit(c) } --- 16Áø ¼ýÀÚ -- 0 ¿¡¼­ 9, a ¿¡¼­ f, ¶Ç´Â A ¿¡¼­ F±îÁö. 
\item {\tt isalnum(c) } --- ±ÛÀÚ¶Ç´Â ¼ýÀÚ 
\item {\tt isspace(c) } --- ºóÄ­, ÅÇ, Ä³¸®Áö¸®ÅÏ, »õÁÙ, form feed. 
\item {\tt ispunct(c) } --- punctuation ¹®ÀÚ(Á¦¾î¹®ÀÚ³ª ±ÛÀÚÁ¦¿ÜÇÑ °Í) 
\item {\tt isprint(c) } --- ÇÁ¸°Æ®°¡´É ¹®ÀÚ -- 0x20(space) ¿¡¼­ 0x7E(tilde) ±îÁö. 
\item {\tt iscntrl(c) } --- delete ¹®ÀÚ (0x7F) ¶Ç´Â ÀÏ¹Ý Á¦¾î¹®ÀÚ (0x20º¸´Ù ÀÛÀº). 
\item {\tt isascii(c) } --- 0x80º¸´Ù ÀÛÀº ASCII ¹®ÀÚ 
\item {\tt isgraph(c) } --- ´«¿¡ º¸ÀÌ´Â ±×¸²¹®ÀÚ -- 0x21(´À³¦Ç¥!)¿¡¼­ 0x7E(tilde) 
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{Character Conversion Macros}
\begin{large}
\begin{verbatim}
    #include <ctype.h>
\end{verbatim}
\begin{itemize}
\item  {\tt  toupper(c) } --- ´ë¹®ÀÚ·Î º¯È¯
\item  {\tt  tolower(c) } --- ¼Ò¹®ÀÚ·Î º¯È¯
\item  {\tt  toascii(c) } --- 0x7F·Î maskÇÏ¿© ¾Æ½ºÅ°¹®ÀÚ·Î º¯È¯
\end{itemize}
\end{large}

\end{itemize}
\end{slide}

\begin{slide}
\begin{itemize}
\item {Functions for Handling Null-Terminated Strings}
\begin{large}
\begin{verbatim}
    #include <strings.h>
\end{verbatim}
\begin{itemize}
\item  {\tt  strlen(s) \ \ \ \ \ \ \ \ \ } --- s¾ÈÀÇ nullÀÌ ¾Æ´Ñ ¹®ÀÚÀÇ °¹¼ö
\item  {\tt  strcmp(s1, s2) \ \ \ \ } --- s1°ú s2¸¦ ºñ±³ÇÑ °á°ú
\item  {\tt  strncmp(s1, s2, n) } --- ÃÖ´ë n°³ÀÇ ¹®ÀÚ¿¡ ´ëÇØ¼­¸¸ ºñ±³
\item  {\tt  strcpy(s1, s2) \ \ \ \ } --- s2¸¦ s1¿¡ º¹»ç
\item  {\tt  strncpy(s1, s2, n) } --- ÃÖ´ë n°³ÀÇ ¹®ÀÚ¿¡ ´ëÇØ¼­¸¸ º¹»ç
\item  {\tt  strcat(s1, s2) \ \ \ \ } --- s2¸¦ s1¿¡ µ¡ºÙÀÓ
\item  {\tt  strncat(s1, s2, n) } --- ÃÖ´ë n°³ÀÇ ¹®ÀÚ¿¡ ´ëÇØ¼­¸¸ µ¡ºÙÀÓ
\item  {\tt  index(s, c) \ \ \ \ \ \ \ } --- s¿¡¼­ c¸¦ Ã£¾Æ ÁÖ¼Ò¸¦ ³Ñ°ÜÁÜ. ¸øÃ£À¸¸é NULL
\item  {\tt  rindex(s, c) \ \ \ \ \ \ } --- ³¡¿¡¼­ºÎÅÍ Ã£¾Æ ÁÜ. ¸øÃ£À¸¸é NULL
\end{itemize}
\end{large}
\end{itemize}


\begin{itemize}
\item {Byte String and Bit String Functions}
\begin{large}
\begin{verbatim}
    #include <strings.h>
\end{verbatim}
\begin{itemize}
\item  {\tt  bcmp(b1, b2, length) \ } --- b1°ú b2¸¦ ºñ±³ °°À¸¸é 0, ´Ù¸£¸é 0¾Æ´Ô
\item  {\tt  bcopy(b1, b2, length) } --- b1À» b2¿¡ length±æÀÌ¸¸Å­ º¹»ç
\item  {\tt  bzero(b, length) \ \ \ \ \ } --- b¿¡ length±æÀÌ¸¸Å­ 0À¸·Î ¸¸µê
\item  {\tt  ffs(i) \ \ \ \ \ \ } --- Ã¹¹øÂ° ¼³Á¤µÈ bit¸¦ Ã£¾ÆÁÜ. ¸Ç ¿À¸¥ÂÊÀÌ 1, ¾øÀ¸¸é 0
\end{itemize}
\end{large}
\end{itemize}
\end{slide}


\begin{slide}
\subsection{Low-Level File I/O}
\begin{Large}
\begin{itemize}

\item{File Descriptor}
\begin{large}
\begin{itemize}
	\item ¸ðµç ÀÔÃâ·Â(I/O)´Â È­ÀÏÀ» ÀÐ°í ¾²´Â °ÍÀ¸·Î ÀÌ·ç¾î Áü
	\item ÇÏ³ªÀÇ °°Àº ¹æ½ÄÀ¸·Î ÇÁ·Î±×·¥°ú ÁÖº¯ÀåÄ¡¿ÍÀÇ Åë½ÅÇÔ.
	\item file descriptor --- small positive integer
	\item ex) READ(5,...) , WRITE(6, ...) in FORTRAN
	\item Ç¥ÁØÀÔÃâ·Â --- 0ÀÌ Ç¥ÁØÀÔ·Â, 1ÀÌ Ç¥ÁØÃâ·Â, 2°¡ Ç¥ÁØ¿À·ùÃâ·Â
	\item redirection --- Ç¥ÁØÀÔÃâ·ÂÀÇ º¯°æÀ¸·Î °¡´ÉÇÔ
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{{\tt read()} and {\tt write()}}
\begin{large}
\begin{itemize}
	\item ¸ðµç ÀÔ·Â°ú Ãâ·ÂÀº {\tt read()}¿Í {\tt write()}¸¦ ÅëÇÔ.
\end{itemize}
\begin{verbatim}
       n_read = read(fd, buf, n);
       n_write = write(fd, buf, n);
\end{verbatim}
\begin{itemize}
	\item µ¹·ÁÁÖ´Â °ª --- ½ÇÁ¦ ¼öÇàµÈ Å©±â
	\item È­ÀÏ ³¡ --- 0, ¿À·ù¹ß»ý : -1
\end{itemize}
\begin{verbatim}
    #define BUFSIZ 1024

    main()  /* copy input to output */
    {
        char     buf[BUFSIZ];
        int n;

        while ((n = read(0, buf, BUFSIZ)) > 0)
            write(1, buf, n);
        exit(0);
    }
\end{verbatim}
\end{large}
\end{itemize}
\end{Large}
\end{slide}

\begin{slide}
\begin{Large}
\begin{itemize}
\item {{\tt open()}, {\tt close()}, {\tt unlink()}}
\begin{large}
\begin{verbatim}
    int fd;
    fd = open(name, rwmode);
\end{verbatim}
\end{large}

\begin{large}
\begin{itemize}
	\item name --- È­ÀÏÀÌ¸§, rwmode --- ¸ðµå (0, 1, 2)
	\item µ¹·ÁÁÖ´Â °ª --- È­ÀÏ descriptor, ¿À·ù¹ß»ý : -1
	\item file descriptor°¹¼öÀÇ Á¦ÇÑ
	\item {\tt close(fd) } --- »ç¿ëÀ» ³¡³¿
	\item {\tt unlink(fd) } --- È­ÀÏ½Ã½ºÅÛ¿¡¼­ È­ÀÏÀÌ¸§À» Áö¿ò
\end{itemize}
\end{large}
\vspace{0.5cm}

\item {Random Access --- {\tt lseek()}}
\begin{large}
\begin{itemize}
	\item sequential I/O, random I/O
\end{itemize}
\begin{verbatim}
        lseek(fd, offset, origin);
\end{verbatim}
\begin{itemize}
	\item offset --- long value
	\item origin --- 0(Ã³À½¿¡¼­ºÎÅÍ), 1(ÇöÀçÀ§Ä¡¿¡¼­ºÎÅÍ), 2(³¡¿¡¼­ºÎÅÍ)
	\item È­ÀÏÀÇ ³¡À¸·Î °¥ °æ¿ì
\end{itemize}
\begin{verbatim}
        lseek(fd, 0L, 2);
\end{verbatim}
\begin{itemize}
	\item ÀÓÀÇÀÇ À§Ä¡¿¡¼­ ÀÐ±â
\end{itemize}
\begin{verbatim}
get(fd, pos, buf, n) /* read n bytes from positition pos */
int fd, n;
long pos;
char *buf;
{
    lseek(fd, pos, 0);   /* get to pos */
    return (read(fd, buf, n));
}
\end{verbatim}
\end{large}
\vspace{0.5cm}
\item{Error Processing}
\begin{large}
\begin{itemize}
	\item ÀÏ¹ÝÀûÀ¸·Î ¿À·ù°¡ ¹ß»ýÇÏ¸é -1¸¦ ³Ñ±ä´Ù.
	\item ¿À·ùÀÇ Á¾·ù¿¡ ´ëÇØ¼­´Â errno¶ó´Â ¿ÜºÎº¯¼ö¿¡ ÀúÀåµÈ´Ù.
	\item {\tt perror}ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸Þ¼¼Áö¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.
\end{itemize}
\end{large}
\end{itemize}
\end{Large}
\end{slide}

\begin{slide}
\subsection{Binary I/O}
\begin{itemize}

\item{{\tt fread()} Function}
\begin{large}
\begin{verbatim}
fread(pointer, sizeof *pointer, items, stream)
    char *pointer;
    int items;
    FILE *stream;
\end{verbatim}
\begin{itemize}
	\item pointer --- objectÀÇ ºí·°¿¡ ´ëÇÑ Æ÷ÀÎÅÍ
	\item items --- objectÀÇ °¹¼ö
	\item stream --- ÀÔ·Â ½ºÆ®¸²
	\item µ¹·ÁÁÖ´Â °ª --- ½ÇÁ¦ ÀÐÇôÁø objectÀÇ °¹¼ö
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{{\tt fwrite()} Function}
\begin{large}
\begin{verbatim}
fwrite(pointer, sizeof *pointer, items, stream)
    char *pointer;
    int items;
    FILE *stream;
\end{verbatim}
\begin{itemize}
	\item pointer --- objectÀÇ ºí·°¿¡ ´ëÇÑ Æ÷ÀÎÅÍ
	\item items --- objectÀÇ °¹¼ö
	\item stream --- Ãâ·Â ½ºÆ®¸²
	\item µ¹·ÁÁÖ´Â °ª --- ½ÇÁ¦ ¾²¿©Áø objectÀÇ °¹¼ö
\end{itemize}
\end{large}
\vspace{0.5cm}

\end{itemize}
\end{slide}

\begin{slide}
\subsection{¸Þ¸ð¸® °ü¸®}
\begin{Large}
\begin{itemize}

\item{{\tt malloc()} Function --- Allocate Memory}
\begin{large}
\begin{verbatim}
char *malloc(num);
    unsigned num;
\end{verbatim}
\begin{itemize}
	\item num ¹ÙÀÌÆ®¸¦ ÇÒ´çÇÑ´Ù.
	\item µ¹·ÁÁÖ´Â °ª --- ÇÒ´çµÈ ÁÖ¼Ò, ¿À·ù¹ß»ý : NULL
	\item {\tt malloc(0)}´Â Á¤ÀÇµÇ¾î ÀÖÁö ¾Ê´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{{\tt free()} Function --- Free Allocated Memory}
\begin{large}
\begin{verbatim}
int free(ptr);
    char *ptr;
\end{verbatim}
\begin{itemize}
	\item {\tt malloc()}¿¡ÀÇÇØ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ µ¹·ÁÁØ´Ù.
	\item µ¹·ÁÁÖ´Â °ª --- 1(¼º°ø), 0(½ÇÆÐ, errno)
	\item Àß¸øµÈ ÁÖ¼Ò¸¦ ³Ñ°ÜÁÖ¸é ¸Þ¸ð¸®°ü¸®°¡ ºÒ°¡´ÉÇØÁø´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{{\tt calloc()} Function --- Allocate Memory for C Objects}
\begin{large}
\begin{verbatim}
char *calloc(num, size);
    unsigned num;
    unsigned size;
\end{verbatim}
\begin{itemize}
	\item °¢ size¿¡ ´ëÇØ num°¹¼ö¸¦ ÇÒ´çÇÑ´Ù.
	\item {\tt malloc()}°ú´Â ´Þ¸® ³»¿ëÀ» 0À¸·Î ÃÊ±âÈ­ÇØÁØ´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}


\item{{\tt cfree()} Function --- Free Allocated Memory }
\begin{large}
\begin{verbatim}
(void) cfree(ptr, num, size)
    char *ptr;
    unsigned num;
    unsigned size;
\end{verbatim}
\begin{itemize}
	\item {\tt calloc()}¿¡¼­ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ µ¹·ÁÁØ´Ù.
	\item Àß¸øµÈ ÁÖ¼Ò¸¦ ³Ñ°ÜÁÖ¸é ¸Þ¸ð¸®°ü¸®°¡ ºÒ°¡´ÉÇØÁø´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}


\item{{\tt realloc()} Function --- Change Size of Allocated Bloack}
\begin{large}
\begin{verbatim}
char *realloc(ptr, size)
    char *ptr;
    unsigned num;
\end{verbatim}
\begin{itemize}
	\item {\tt calloc()}¿¡¼­ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ µ¹·ÁÁØ´Ù.
	\item Àß¸øµÈ ÁÖ¼Ò¸¦ ³Ñ°ÜÁÖ¸é ¸Þ¸ð¸®°ü¸®°¡ ºÒ°¡´ÉÇØÁø´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}


\item{{\tt memalign()} Function --- Allocate to Alignment Boundary}
\begin{large}
\begin{verbatim}
char *memalign(alignment, size)
    unsigned alignment;
    unsigned size;
\end{verbatim}
\begin{itemize}
	\item alignment °¡ÀåÀÚ¸®¿¡ ¸ÂÃß¾î size ¹ÙÀÌÆ®¸¦ ÇÒ´çÇÑ´Ù.
	\item alignment´Â 2ÀÇ ´©½ÂÀÌ¾î¾ß ÇÏ¸ç, word Å©±âº¸´Ù´Â Ä¿¾ßÇÑ´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}


\item{{\tt valloc()} Function --- Allocate Memory on a Page Boundary}
\begin{large}
\begin{verbatim}
char *valloc(size)
    unsigned size;
\end{verbatim}
\begin{itemize}
	\item memalign(getpagesize(), size) ¿Í °°´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{{\tt alloca()} Function --- Allocate Memory on Stack}
\begin{large}
\begin{verbatim}
char *alloca(size)
    unsigned size;
\end{verbatim}
\begin{itemize}
	\item callerÀÇ stack frame¿¡ size ¹ÙÀÌÆ®¸¦ ÇÒ´çÇÑ´Ù.
	\item caller°¡ returnÇÒ¶§ ÀÚµ¿ÀûÀ¸·Î ÇØÁ¦µÈ´Ù.
	\item ±â°è¿Í ÄÄÆÄÀÏ·¯¿¡ ÀÇÁ¸ÀûÀÌ¹Ç·Î »ç¿ëÇÏÁö ¸»±â ¹Ù¶õ´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}

\end{itemize}

\end{Large}
\end{slide}


\begin{slide}
\subsection{¸Þ¸ð¸® ÇÒ´çÀÇ ¹ú·¹Àâ±â}
\begin{Large}
\begin{itemize}
\item Ç¥ÁØ¶óÀÌºê·¯¸®¿¡ ¾ø´Â °ÍÀ¸·Î SunOSÀÇ /usr/lib/debug/malloc.o¿¡ ÀÖ´Ù.

\item{{\tt malloc\_debug()} Function --- Set Debug Level}
\begin{large}
\begin{verbatim}
int malloc\_debug(level)
    int level;
\end{verbatim}
\begin{itemize}
	\item {\tt malloc()}, {\tt calloc()}, {\tt realloc()}, {\tt memalign()},
	\item {\tt cfree()}, {\tt free()}, {\tt malloc()}, {\tt malloc()}
	\item À§ÀÇ ÇÔ¼öµéÀÌ »ç¿ëµÉ ¶§ÀÇ ¿À·ùÁø´Ü ¼öÁØÀ» Á¶Á¤ÇÑ´Ù.
	\item 0 : Ç¥ÁØ ¶óÀÌºê·¯¸®¿Í °°´Ù.
	\item 1 : ¿À·ù¹ß»ý½Ã stderr·Î ¸Þ¼¼Áö Ãâ·ÂÈÄ Áß´ÜÇÑ´Ù.
	\item 2 : ¸Å¹ø ºÒ¸±¶§¸¶´Ù ÀüÃ¼ heapÀ» °Ë»çÇÑ´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}

\item{{\tt malloc\_verify()} Function --- Check Storage Allocation Heap}
\begin{large}
\begin{verbatim}
int malloc\_verity()
\end{verbatim}
\begin{itemize}
	\item heap¿¡ Àß¸øÀÌ ¾ø´ÂÁö °Ë»çÇÑ´Ù.
	\item Àß¸øÀÌ ¾øÀ¸¸é 1, ÀÖÀ¸¸é 0À» µ¹·ÁÁØ´Ù.
	\item ¸¹Àº ½Ã°£ÀÌ °É¸®¹Ç·Î ³²¿ëÇÏÁö ¾Ê´Â°Ô ÁÁ´Ù.
\end{itemize}
\end{large}
\vspace{0.5cm}

\end{itemize}
\end{Large}
\end{slide}


\begin{slide}
\subsection{I/O Control and Terminal I/O}
\begin{Large}
\begin{itemize}

\item{I/O Control}
\begin{large}
\begin{verbatim}
int ioctl(fd, request, arg)
    int fd, request;
    caddr_t arg; /* typedef char *caddr_t; or int */
\end{verbatim}
\end{large}

\begin{itemize}
\begin{large}
    \item descriptor fd¿¡ ´ëÇØ Æ¯º°ÇÑ ±â´ÉÀ» ¼öÇà
    \item requestÀÇ Á¾·ù´Â °¢°¢¿¡ µû¶ó ´Ù¸§
    \item arg´Â ÀÏ¹ÝÀûÀ¸·Î ÁÖ¼Ò¸¦ °¡¸®Å°³ª ±×ÀÚÃ¼·Î °ªÀÏ ¼öµµ ÀÖ´Ù.
    \item µ¹·ÁÁÖ´Â °ª --- 0(¼º°ø), -1(½ÇÆÐ, errno)
    \item ¿©·¯°¡Áö I/OÀÇ Á¾·ù¿Í ±â´É¿¡ ´ëÇØ¼­´Â {\tt man 4 intro} ÂüÁ¶ÇÒ °Í
\end{large}
\end{itemize}
\vspace{0.5cm}

\item{Terminal I/O Control ({\tt termios(3V)}ÂüÁ¶)}
\begin{large}
\begin{verbatim}
#include <termios.h>
#include <unistd.h>

int tcgetattr(fd, termios_p)
    int fd;
    struct termios *termios_p;

int tcsetattr(fd, optional_actions, termios_p)
    int fd;
    int optional_actions;
    struct termios *termios_p;
...
    struct termios {
          tcflag_t     c_iflag;  /* input modes */
          tcflag_t     c_oflag;  /* output modes */
          tcflag_t     c_cflag;  /* control modes */
          tcflag_t     c_lflag;  /* local modes */
          cc_t    c_cc[NCCS];    /* control chars */
    }
\end{verbatim}
\end{large}

\begin{itemize}
\begin{large}
	\item ºñµ¿±âÅë½Å Æ÷Æ®¸¦ Á¦¾îÇÏ±â À§ÇÑ ÀÏ¹Ý ÅÍ¹Ì³¯ ÀÎÅÍÆäÀÌ½º¸¦ Á¦°ø
	\item ÀÚ¼¼ÇÑ ±â´É¿¡ ´ëÇØ¼­´Â termio(4)¿¡ ÀÚ¼¼È÷ ³ª¿È
	\item °°Àº ±â´ÉÀ» À§ÇÑ ioctl()ÀÎÅÍÆäÀÌ½ºº¸´Ù ÀÌ ÀÎÅÍÆäÀÌ½º°¡ ÁÁÀ½
\end{large}
\end{itemize}

\end{itemize}
\end{Large}
\end{slide}

\end {document}
