2. C

2.1. ÄÄÆÄÀÏ Çϱâ(make »ç¿ëÇÔ)

hello.c ¼Ò½º
#include <stdio.h>

main()
{
  printf ("This is test program");
}
    
hello.c ¼Ò½º

hello.c ÄÄÆÄÀÏÇϱâ

gcc -o hello hello.c

./hello
This is test program
    

¡Ø gcc ¿É¼Ç

c ¾ð¾î´Â ±âº»ÀûÀ¸·Î ÄÄÆÄÀÏÀ» ¸ÕÀú ÇØ¼­ object È­ÀÏÀ» ¸¸µé¾î ÁÝ´Ï´Ù.

±×¸®°í ³ª¼­ link¸¦ ÇØÁ־ ½ÇÇà È­ÀÏÀ» ¸¸µé¾î ÁÝ´Ï´Ù.

-o name : ½ÇÇà È­ÀÏ À̸§À» Á¤Çؼ­ ¸¸µé¾î ÁØ´Ù.

-c : ÄÄÆÄÀϸ¸ ÇÑ´Ù.

make »ç¿ëÇϱâ
# all ¸í·ÉÀ» ½ÇÇàÇÑ´Ù.
all:   excute 

# ¿ÀÇÁÁ§Æ® È­ÀÏÀ» ¸¸µç´Ù.
object:     hello.o

# ½ÇÇà È­ÀÏ ¸¸µç´Ù.
excute :        hello

# ¿ÀÇÁÁ§Æ® È­ÀÏÀ» Áö¿î´Ù.
clean:
            rm -f collage *.o
    

make ½ÇÇà
cc    -c hello.c -o hello.o
cc   hello.o   -o hello
    

À̶§ ¿ÀÇÁ Á§Æ® È­ÀÏÀÌ ¾ø¾î¾ß ÇÑ´Ù.(*.o)

hello ½ÇÇà
This is test program
    

2.2. make »ç¿ëÇÒ¼ö ÀÖµµ·Ï ¸¸µé±â

autoscan

mv configure.scan configure.in

configure.in ¼öÁ¤
dnl Process this file with autoconf to produce a configure script.
AC_INIT()

AC_CONFIG_HEADER(config.h)

dnl Checks for programs.

.....
.....
.....

AC_OUTPUT( Makefile )
    

aclocal

autoheader

autoconf

automake (--add-missing)

./configure

2.3. ¸ðµâ(¶óÀ̺귯¸®) ±âÃÊ

  1. Á¤Àû ¶óÀ̺귯¸®

    .a

  2. °øÀ¯ ¶óÀ̺귯¸®

    .so, .sa

  3. Á¤Àû ¶óÀ̺귯ÀÇ ´ÜÁ¡Àº µ¿½Ã¿¡ ¿©·¯ ÇÁ·Î±×·¥À» ¶ç¿üÀ» °æ¿ì À̵éÀÌ ¸ðµÎ °°Àº ¶óÀ̺귯¸®ÀÇ ÇÔ¼öµéÀ» »ç¿ëÇÔÀ¸·Î½á ¸Þ¸ð¸®¿¡ °°Àº ÇÔ¼öµéÀ» ¿©·¯ ¹ø º¹»çÇϰí, ÇÁ·Î±×·¥ ÆÄÀÏ¿¡µµ °°Àº ¶óÀ̺귯¸®¸¦ ¿©·¯ ¹ø º¹»ç¸¦ ÇÑ´Ù´Â °ÍÀÌ´Ù.

    ÀÌ´Â ¸Þ¸ð¸® ¿ë·®°ú µð½ºÅ© ¿ë·®À» ¸¹ÀÌ ¼Ò¸ðÇÑ´Ù. ¸¹Àº À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â ÀÌ·¯ÇÑ ºÒÆíÇÔÀ» ±Øº¹ÇÒ ¼ö ÀÖµµ·Ï °øÀ¯ ¶óÀ̺귯¸®¸¦ Á¦°øÇÑ´Ù.

  4. python °øÀ¯ ¸ðµâ ¸¸µé±â
    #!/bin/bash
    
    echo $1
    
    if [ $# = 0 ] ;then
        echo "»ç¿ë¹ý : È®ÀåÀÚ(.c)¸¦ »« ¼Ò½º À̸§À» ÀÔ·ÂÇϼ¼¿ä."
        exit 0
    fi
    swig -python -module $1 $1.c
    gcc -c $1.c $1_wrap.c -I/usr/include/python1.5 -I/usr/lib/python1.5/config
    ld -shared $1.o $1_wrap.o -o $1module.so
            

2.4. talk_server

´ëÈ­¹æ ¼­¹ö ÀÔ´Ï´Ù.

ÄÄÆÄÀÏ : gcc -o talker_server talk_server.c

½ÇÇà : talk_server 3000

¼Ò½º
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXLINE 512

char * escapechar = "exit";

int main(int argc, char * argv[]) 
{
int server_fd, client_fd;
int clilen, num;

char sendline[MAXLINE], recvline[MAXLINE];

int size;
pid_t pid;
struct sockaddr_in client_addr, server_addr;

  if(argc != 2) 
  {
    printf("»ç¿ë¹ý : %s port  ", argv[0]);
    exit(0);
  }

  if((server_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) 
  {
    printf("Server : Can't open stream socket ");
    exit(0);
  }

  bzero((char *) & server_addr, sizeof(server_addr));

  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  server_addr.sin_port = htons(atoi(argv[1]));

  if(bind(server_fd, (struct sockaddr *) & server_addr, sizeof(server_addr)) < 0) 
  {
    printf("Server : Can't bind local address");
    exit(0);
  }

  printf("Server started. Waiting for client.. ");
  listen(server_fd, 1);

  clilen = sizeof(client_addr);
  if((client_fd = accept(server_fd, (struct sockaddr *) & client_addr, &clilen)) < 0) 
  {
    printf("Server : failed in accepting.");
    exit(0);
  }

  if(( pid = fork()) > 0) 
  {
    while(fgets(sendline, MAXLINE, stdin ) != NULL) 
    {
      size = strlen(sendline);
      if(write(client_fd, sendline, strlen(sendline)) != size) printf("Error in write ");
      if(strstr(sendline, escapechar) != NULL) 
      {
        printf("Good bye.");
        close(client_fd);
        exit(0);
      }
    }
  } else if (pid == 0) 
  {
  while(1) 
  {
    if((size = read(client_fd, recvline, MAXLINE)) < 0) 
    {
      printf("Error if read ");
      close(client_fd);
      exit(0);
    }

    recvline[size] = '';
    if(strstr(recvline, escapechar) != NULL) break;

    printf("%s", recvline);
    }
  }

  close(server_fd);
  close(client_fd);
}
    

2.5. talk_client

´ëÈ­¹æ Ŭ¶óÀÌ¾ðÆ® ÀÔ´Ï´Ù.

ÄÄÆÄÀÏ : gcc -o talk_client talk_client.c

½ÇÇà : talk_client SERVERIP 3000

¼Ò½º
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXLINE 1024

char *escapechar = "exit";

int main(int argc, char *argv[]) 
{
  char line[MAXLINE], sendline[MAXLINE], recvline[MAXLINE+1];

  int n, size, comp;

  pid_t pid;

  static int s;

  static struct sockaddr_in server_addr;

  if(argc != 3) 
  {
    printf("»ç¿ë¹ý : %s server_IP port ", argv[0]);
    exit(0);
  }

  if((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) 
  {
    printf("Client: Can't open stream socket. ");
    exit(0);
  }

  bzero((char *) & server_addr, sizeof(server_addr));

  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = inet_addr(argv[1]);
  server_addr.sin_port = htons(atoi(argv[2]));

  if(connect(s, (struct sockaddr *) & server_addr, sizeof(server_addr)) < 0) 
  {
    printf("Client: can't connect to server. ");
    exit(0);
  }

  if(( pid = fork()) > 0) 
  {
    while(fgets(sendline, MAXLINE, stdin) != NULL) 
    {
      size = strlen(sendline);
      if(write(s, sendline, strlen(sendline)) != size) printf("Error in write ");

      if(strstr(sendline, escapechar) != NULL) 
      {
        printf("Good bye. ");
        close(s);

        exit(0);
      }
    }
  } else if(pid == 0) 
  {
    while(1) 
    {
      if((size = read(s, recvline, MAXLINE)) < 0) 
      {
        printf("Error if read ");
        close(s);
      }
      recvline[size] = '';
      if(strstr(recvline, escapechar) != NULL) break;

      printf("%s", recvline);
    }
  }
  close(s);
}
    

2.6. ÀÎÀÚ Ã³¸® ÇÔ¼ö

ÇÁ·Î±×·¥ ½ÇÇÛÇÒ¶§ÀÇ ÀÎÀÚ Ã³¸® ¹æ¹ýÀÔ´Ï´Ù.
#include <stdio.h>

char *programname; // usage()

char a;
char *b = "";
unsigned int d = 1;

void usage ();

main(int argc, char **argv)
{
char option;
extern char *optarg;
programname = argv[0]; // ÇÁ·Î±×·¥ À̸§À» º¯¼ö¿¡ ³Ö´Â´Ù.

  if (argc < 2) usage (); // ÀÎÀÚ°¡ ¾øÀ¸¸é usage() ÇÔ¼ö È£Ãâ

  while ((option = getopt (argc, argv, "a:b")) != -1) 
  { // ÀÎÀÚ Ã³¸® ÇÔ¼ö 
    switch (option) 
    {
      case 'a':
        a = 1;
        break;
      case 'b':
        b = optarg;
        break;
      default:
        usage ();
    }
  }

  printf("a : %d , b : %s", a, b);
}

void usage ()
{
    printf ("»ç¿ë¹ý : %s [-a ÀÎÀÚ] [-b ÀÎÀÚ] [-c ÀÎÀÚ] [-d ÀÎÀÚ]", programname);
    exit (1);
}
    

2.7. daytime.c ¼Ò½ºÀÔ´Ï´Ù.

daytime.c ¼Ò½ºÀÔ´Ï´Ù.
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define BUF_LEN 128

int main(int argc, char *argv[]) 
{
int sockfd, n;

char *haddr;
struct sockaddr_in server_addr; /* ¼­¹ö ÁÖ¼Ò¸¦ ³ÖÀ» ±¸Á¶Ã¼ */
char buf[BUF_LEN + 1];

  if(argc != 2) 
  {
    printf("»ç¿ë¹ý : %s ip_address", argv[0]);
    exit(0);
  }

  haddr = argv[1];

  if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) 
  {
    printf("¼ÒÄÏÀ» ¸¸µé¼ö ¾ø½À´Ï´Ù.");
    exit(0);
  }

  bzero((char *) &server_addr, sizeof(server_addr)); /* ÃʱâÈ­¸¦ ÇØÁØ´Ù. */

  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(13); /* daytime ¼­¹ö Æ÷Æ®¸¦ ¼³Á¤ÇÑ´Ù. */
  server_addr.sin_addr.s_addr = inet_addr(argv[1]);

  if(connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) 
  {
    printf("¼­¹ö Æ÷Æ®¿¡ Á¢¼ÓÀ» ÇÒ¼ö ¾ø½À´Ï´Ù.");
    exit(0);
  }

  while((n = read(sockfd, buf, BUF_LEN)) > 0) 
  {
    buf[n] = '';
    if(fputs(buf, stdout ) == EOF) printf("aaaa");
  }

  close(sockfd);
}
    

2.8. ½Ã±×³Î ÇÔ¼ö

ÄÜÆ®·Ñ ŰÀÇ Á¶ÇÕ ÇÒ¶§ »ç¿ëÇÏ´Â ÇÔ¼ö ÀÔ´Ï´Ù.

½Ã±×³Î ÇÔ¼ö : /usr/include/bits/signum.h

ÄÄÆÄÀÏ : gcc -o signal_test signal_test.c

½ÇÇà : ./signal_test

¼Ò½º
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int my_signal(void); // »õ·Î¿î ½Ã±×³Î ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.
int count = 0;  // ctrl-c ÀԷ Ƚ¼ö Ä«¿îÅÍ

int main()
{
  int i = 0;

  if(signal(SIGINT, my_signal) == SIG_ERR) 
  { // ½Ã±×³Î ÇÔ¼ö¸¦ ÀÛµ¿ ½ÃŲ´Ù.
    printf("singal() error");
    exit(0);
  }

  while(count < 3) 
  { // contrl-c ÀÔ·ÂÀÌ 3¹ø±îÁö 
    sleep(1); // 1Ãʰ¡ Á¤Áö
    printf("%d", i++); //  ctrl-c Ä«¿îÅÍ
  }

}

int my_signal(void)
{
  printf("Ctrl-C pressed. ");
  count++;
  return 0;
}
    

2.9. È£½ºÆ® À̸§ ¾Ë¾Æ³»´Â ÇÁ·Î±×·¥

ÄÄÆÄÀÏ : gcc -o test test.c

¼Ò½º1
#include <stdio.h>
#include <fcntl.h>

int main()
{
    char hostname[124];
    FILE *fd;
    fd = fopen("/proc/sys/kernel/hostname", "r");

    fread(hostname, sizeof(hostname), 1, fd);
    printf("%s", hostname);

    return 0;
}
    

¼Ò½º2
#include <unistd.h>
#include <netdb.h>

main ()
{
  struct hostent* hoststruct;
  char hostname[255];

  gethostname(hostname, 100);
  hoststruct = gethostbyname(hostname);
  printf("È£½ºÆ® À̸§Àº %s ÀÔ´Ï´Ù.\n", hoststruct->h_name);
}
    

2.10. ´Ù±¹¾î Å×½ºÆ® ÇÁ·Î±×·¥(gettext)

  1. hello.po¸¦ ¸¸µé¾î ÁØ´Ù.

    xgettext -a -d hello -k_ -s hello.c

  2. mo È­ÀÏÀ» ¸¸µé¾î ÁÖ´Â »ç¿ë¹ýÀÔ´Ï´Ù.

    msgfmt hello.po

    messages ¶ó´Â È­ÀÏÀÌ »ý±â´Âµ¥ À̰ÍÀ» À̸§À» ¹Ù²Ù¾î ÁÖ¸é µË´Ï´Ù.

    mv hello.po hello.mo

  3. ·ÎÄÉÀÏ µð·ºÅ丮¿¡ Ä«ÇǸ¦ ÇÕ´Ï´Ù.

    cp hello.mo /usr/share/locale/ko/LC_MESSAGES/hello.mo

  4. ¼Ò½º¸¦ ÄÄÆÄÀÏ ÇÕ´Ï´Ù.

    gcc -o hello hello.c

  5. ¼Ò½º
    #include <locale.h>
    #include <stdio.h>
    #include <libintl.h>
    #define _(String) gettext (String)
    
    int main(void)
    {
        setlocale (LC_ALL, "");
        bindtextdomain ("hello", "/usr/share/locale/");
        textdomain ("hello");
    
        puts (_("hello"));
    }
           

  6. hello.po
    #: hello.c:24
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: 1.0\n"
    "POT-Creation-Date: 2001-03-08 17:06+0900\n"
    "PO-Revision-Date: 2001-03-08 17:06+0900\n"
    "Last-Translator: Kim Yong Il <nalabi@formail.org>\n"
    "Language-Team: Uniwork Project Team <nalabi@formail.org>\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=ecu-kr\n"
    "Content-Transfer-Encoding: 8-bit\n"
    
    #: hello.c:25 hello.c:26 hello.c:28
    msgid "hello"
    msgstr "¾È³çÇϼ¼¿ä
            

  7. Makefile
    # Makefile for locale directory
    
    CWD = locale
    MSGFMT = msgfmt
    SUB_DIRS =
    FILES_PO:=$(wildcard *.po)
    FILES_MO:=$(FILES_PO:.po=.mo)
    
    LOCALEDIR ?= /usr/share/locale
    
    ifeq ($(enable_nls),1)
    all: mo-files
    
    mo-files: $(FILES_MO)
    
    install:
        $(MAKE) all
        for f in *.mo ; do mkdir -p \
            $(INSTALL_PREFIX)$(LOCALEDIR)/`basename $$f .mo`/LC_MESSAGES ; \
            cp $$f $(INSTALL_PREFIX)$(LOCALEDIR)/`basename $$f .mo`/LC_MESSAGES/gkrellm.mo ; done
    
    %.mo: %.po
        $(MSGFMT) -f -v -o $@ $<
    
    else
    
    all:
    
    install:
    
    endif
    
    clean:
        $(RM) $(FILES_MO)
            

2.11. define ¿¹Á¦

  1. ¼Ò½º
    #include "stdio.h"
    
    #define TEST(test)      my_func_##test()
    #define test(num)       __asm__ __volatile__("call test_" #num::);
    
    void my_func_hello(void)
    {
      printf("HELLO !!\n");
    }
    
    
    void my_func_goodbye(void)
    {
      printf("Good Bye !!\n");
    }
    
    
    void test_1(void)
    {
      printf("This is test_1 function\n");
    }
    
    
    void test_2(void)
    {
      printf("This is test_2 function\n");
    }
    
    
    main()
    {
      int i;
      TEST(hello);
      TEST(goodbye);
    
      test(1);
      test(2);
    }
            

  2. ÄÄÆÄÀÏ

    gcc -o t test.c

  3. ½ÇÇà
    HELLO !!
    Good Bye !!
    This is test_1 function
    This is test_2 function
          

2.12. ã±â¸¦ ¿øÇÏ´ÂÈ­ÀÏ

¼Ò½º
#include 

int ftw_find();

int main(int argc, char *argv[])
{
  if (argc > 1)
  {
    ftw(argv[1],ftw_find, 0);
  }
  else
  {
    printf("Usage: %s dir\n", argv[0]);
  }
  return 0;
}

int ftw_find(const char *path, struct stat *sb, int flag)
{
  if(strstr(path,"ã°íÀÚ ÇÏ´Â ÆÄÀÏÀ̳ª µð·ºÅ丮")!=NULL)
  {
    printf("%s:\t%u\t\n", path, sb->st_size);
    exit(0);
  }
  return 0;
}
    

2.13. Ä¿³Î ½Ã½ºÅÛ ÄÝ ÇÔ¼ö

unistd.h Çì´õ

/usr/src/linux-2.4.18# vi include/asm/unistd.h
#define __NR_lremovexattr   236
#define __NR_fremovexattr   237
#define __NR_mycall         238
    

entry.S

/usr/src/linux-2.4.18# vi arch/i386/kernel/entry.S
    .long SYMBOL_NAME(sys_ni_syscall)   /* reserved for lremovexattr */
    .long SYMBOL_NAME(sys_ni_syscall)   /* reserved for fremovexattr */
    .long SYMBOL_NAME(sys_mycall) 		/* 238 mycall */
    

mycall.c

/usr/src/linux-2.4.18# vi kernel/mycall.c
#include <linux/kernel.h>
#include <linux/errno.h>

asmlinkage void sys_mycall()
{       
    printk("Corea Manse!!!!\n");
} 
    

krernel/Makefile

/usr/src/linux-2.4.18# vi kernel/Makefile
obj-y     = sched.o dma.o fork.o exec_domain.o panic.o printk.o \
        module.o exit.o itimer.o info.o time.o softirq.o resource.o \
        sysctl.o acct.o capability.o ptrace.o timer.o user.o \
        signal.o sys.o kmod.o context.o mycall.o
    

user Makefile
COMPILE=gcc

INCLUDEDIR = /usr/src/linux-2.4.18/include

MODCFLAGS := -I$(INCLUDEDIR)

mycall_app : mycall_app.c

    $(COMPILE) $(MODCFLAGS) -o $@ $^
    

¼Ò½º (mycall_app.c)
#include <linux/unistd.h>

/* system call stub function */
_syscall0(void, mycall);

main()
{
  mycall();
}
    

2.14. ¸Æ¾îµå·¹½º ¾Ë¾Æ³»±â

¼Ò½º
#include <netinet/ether.h>
#include <net/ethernet.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
  struct ifreq *iflist;
  struct sockaddr *sa;
  int fd;
  char *out;

  if(argc != 2) 
  {
    printf("Usage: progname ifname (ex: progname eth0)\n");
    return -1;
  }
 
  iflist = malloc (sizeof (struct ifreq));

  fd = socket (PF_INET, SOCK_STREAM, 0);

  strncpy (iflist->ifr_name, argv[1], strlen (argv[1]));

  if (ioctl (fd, SIOCGIFHWADDR, iflist) == -1)
  {
    perror ("ioctl failed");
    return -1;
  }

  sa = &(iflist->ifr_hwaddr);

  out = ether_ntoa ((struct ether_addr *) sa->sa_data);

  printf ("%s\n", out);

  return 0;
}