'분류 전체보기'에 해당되는 글 63건

  1. 2010.01.27 getopt
  2. 2010.01.22 세마포어
  3. 2010.01.21 Pid를 통해 process 정보 얻기
  4. 2010.01.21 sigaction
  5. 2010.01.20 File Lock 및 fcntl
  6. 2010.01.14 shared memory
  7. 2009.08.25 MySQLdb 사용하기
  8. 2008.10.29 ssh시 Connection refused 에러 처리
  9. 2008.10.29 scp암호 물어보지 않고 사용하기
  10. 2008.08.20 에러로그남기는 함수

getopt

|
#include <unistd.h>
int getopt (int argc, char **argv, const char *options)
    실패시 또는 더이상 처리할 옵션이 없을 시 -1  성공시 option 문자

unistd.h 에 선언되어있는 extern 변수들
  1. int opterr : 0이 아닐경우 getopt가 실패한 경우이다 (또한 에러일경우 getopt는 charater ?를 반환한다)
  2. int optopt : 잘못된 옵션이나 argument가 필요한데 빠져 있을 경우 여기에 charater가 저장된다 (getopt가 ?를 반환할 때 체크해보면됨)
  3. int optind : 현재 처리되고 있는 다음의 옵션의 argv에서의 index (초기에는 1, 옵션과 제일 마지막에 옵션 아닌 부분을 구별할때 사용)
  4. char * optarg : argument를 갖는 옵션일 경우 해당 값이 optarg에 저장된다

argv의 규칙
  - 파라매터 다음에 : 가 있으면 argument가 필요한 옵션이라는것
  - 파라매터 다음에 :: 가 있으면 argument가 있어도 그만 없어도 그만인 옵션이라는 것

특징
  1. optind와 argc를 기준으로 option외의 문자가 argv에 남아 있는지 체크할 수 있다
  2. optarg는 argv의 포인터이다 
  3. argv 처음이 : 일 경우는 ? 를 반환하지 않고 : 를 반환한다
  4. -- 가 argv에 있으면 -- 에서 argument parsing을 중단한다


사용법
  
#include 
char c;
int aValue, bValue;
opterr = 0;
while ((c = getopt (argc, argv, "abc:")) != -1) {
  switch (c) {
    case 'a' :
        aValue = 1;
        break;
    case 'b':
        bValue = 1;
        break;
    case 'c':
        value = optarg;
        break;
    case '?':
        if (optopt == 'c') {
           printf ("Option -%c requires an argument.\n", optopt);
        }
        else {
           print f("Option -%c unknown option\n", optopt);
        }
        break;
     default:
       abort(); 
   }
}
for (index = optind; index < argc; index++) {
  printf ("Non-option argument %s\n", argv[index]);
}
And

세마포어

|

#include <sys/sem.h>
int semctl (int semid, int semnum, int cmd, ...);
int semget (key_t key, int nsems, int semflg);
int semop(int semid, struct sembuf *sops, size_t nsops);


==== semget ====
Mode bits:
   IPC_CREATE : create entry if key does not exist
   IPC_EXCL     : key가 존재시 실패
   IPC_NOWAIT  : 요청이 wait해야하는 경우 실패함
Keys:
   IPC_PRIVATE : private key.
control commands:
   IPC_RMID      : identifier를 삭제
   IPC_SET        : set option
   IPC_STAT      : get option


// semctl에서 사용하기위해서 application에서 직접 선언해야함 (standard header파일에는 존재하지 않음)
union semun {
    int val;
    struct semid_ds *buf;
    unsigned short  *array;
} arg;

/* Structure used for argument to `semop' to describe operations.  */
struct sembuf
{
  unsigned short int sem_num;   /* semaphore number */
  short int sem_op;     /* semaphore operation */
  short int sem_flg;        /* operation flag */
};

 

/* Flags for `semop'.  */
#define SEM_UNDO    0x1000      /* undo the operation on exit */
IPC_NOWAIT                             /* semaphore를 얻는데 실패해도 wait하지 않는다 */

/* Commands for `semctl'.  */
#define GETPID      11      /* get sempid */
#define GETVAL      12      /* get semval */
#define GETALL      13      /* get all semval's */
#define GETNCNT     14      /* get semncnt */
#define GETZCNT     15      /* get semzcnt */
#define SETVAL      16      /* set semval */
#define SETALL      17      /* set all semval's */


/* Data structure describing a set of semaphores.  */
struct semid_ds
{
  struct ipc_perm sem_perm;     /* operation permission struct */
  __time_t sem_otime;           /* last semop() time */
  unsigned long int __unused1;
  __time_t sem_ctime;           /* last time changed by semctl() */
  unsigned long int __unused2;
  unsigned long int sem_nsems;      /* number of semaphores in set */
  unsigned long int __unused3;
  unsigned long int __unused4;
};


structure ipc_perm
{
  uid_t    uid    //Owner's user ID. 
    gid_t    gid   //
Owner's group ID. 
    uid_t    cuid  //
Creator's user ID. 
    gid_t    cgid  //
Creator's group ID. 
    mode_t   mode  //
Read/write permission.
}

And

Pid를 통해 process 정보 얻기

|
/proc/{pid}/psinfo 파일을 읽어와서 필요한 정보를 얻어온다

예)
psinfo_t ps_info;

memset (&ps_info, 0, sizeof (psinfo_t));
sprintf (buf, "/proc/%d/psinfo", pid);
if ((fd = open (buf, O_RDONLY)) < 0) {
  exit(-1);
}

read (fd, &ps_info, sizeof(psinfo_t));
close (fd);

typedef struct psinfo {
    int     pr_flag;        /* process flags */
    int     pr_nlwp;        /* number of lwps in process */
    pid_t   pr_pid;         /* unique process id */
    pid_t   pr_ppid;        /* process id of parent */
    pid_t   pr_pgid;        /* pid of process group leader */
    pid_t   pr_sid;         /* session id */
    uid_t   pr_uid;         /* real user id */
    uid_t   pr_euid;        /* effective user id */
    gid_t   pr_gid;         /* real group id */
    gid_t   pr_egid;        /* effective group id */
    uintptr_t pr_addr;      /* address of process */
    size_t  pr_size;        /* size of process image in Kbytes */
    size_t  pr_rssize;      /* resident set size in Kbytes */
    size_t  pr_pad1;
    dev_t   pr_ttydev;      /* controlling tty device (or PRNODEV) */
        /* The following percent numbers are 16-bit binary */
        /* fractions [0 .. 1] with the binary point to the */
        /* right of the high-order bit (1.0 == 0x8000) */
    ushort_t pr_pctcpu;     /* % of recent cpu time used by all lwps */
    ushort_t pr_pctmem;     /* % of system memory used by process */
    timestruc_t pr_start;   /* process start time, from the epoch */
    timestruc_t pr_time;    /* usr+sys cpu time for this process */
    timestruc_t pr_ctime;   /* usr+sys cpu time for reaped children */
    char    pr_fname[PRFNSZ];       /* name of execed file */
    char    pr_psargs[PRARGSZ];     /* initial characters of arg list */
    int     pr_wstat;       /* if zombie, the wait() status */
    int     pr_argc;        /* initial argument count */
    uintptr_t pr_argv;      /* address of initial argument vector */
    uintptr_t pr_envp;      /* address of initial environment vector */
    char    pr_dmodel;      /* data model of the process */
    char    pr_pad2[3];
    int     pr_filler[7];   /* reserved for future use */
} psinfo_t;
And

sigaction

|
int sigaction (int signum, const struct sigaction *restrict action, struct sigaction *restrict old-action)
    signum에 대한 action을 셋팅해준다 old-action은 셋팅하기전의 이전의 action이 반환된다.
    action이 null일 경우에는 old-action을 통해서 현재 셋팅된 action에 대한 값을 얻어올수 있다.

struct sigaction {
    sighandler_t sa_handler;  // SIG_DFL, SIG_IGN, 함수포인터 가 될수 있다
    sigset_t sa_mask;            // handler가 실행될 동안 block되야하는 signal (기본적으로 block되므로 unblock하고 싶으면 조작해줘야함)
    int sa_flags;
}
    sa_flags:
        SA_NOCLDSTOP : SIG_CHLD에만 의미가 있고 셋팅되어있으면 terminated child에 대해서만 signal을 보냄 (stop된것에는 보내지않음)
        SA_ONSTACK     : signal stack을 사용한다, 만약 sigaltstack()나 sigstack()를 통해서 다른 시그널 스택 영역을 할당해 놓았다면, 시그널들이 이 새로운 스택 영역으로 전달되게 한다.
        SA_RESTART     : open, read, write같은 함수 실행중 signal이 발생할경우 어떤식으로 할지 정한다 (이게 셋팅되어있으면 library함수를 재시작한다)



sigset_t    : signal을 표현하고 있는 구조체 또는 정수로 선언됨 (signal.h)

bits/sigset.h
# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
  {
    unsigned long int __val[_SIGSET_NWORDS];
  } __sigset_t;

========= sigset_t를 조작하거나 셋팅하는 함수 ============

int sigemptyset (sigset_t *set)
    sigset_t에 모든 signal셋팅을 clear한다

int sigfillset (sigset_t *set)
    sigset_t에 모든 signal셋팅을 한다

int sigaddset (sigset_t *set, int signum)
    sigset_t에 signum signal을 셋팅한다

int sigdelset (sigset_t*set, int signum)
    sigset_t에 signum을 제거한다

int sigismember (const sigset_t *set, int signum)
    sigset_t에 signum이 셋팅되어있는지 체크 (1이면 있음)

int sigprocmask (int how, const sigset t *restrict set, sigset t *restrict oldset)
    호출한 process의 signal을 변형하거나 examine한다
    how :
             SIG_BLOCK     : set에 있는 signal을 block한다  (기존의 mask에 set에 등록된 signal을 추가한다)
             SIG_UNBLOCK : 기존의 signal set에서 set에 있는 signal을 unlock한다
             SIG_SETMASK : 이전의 signal set을 무시하고 set으로 signal을 셋팅한다
    oldset : 기존의 signal set이 저장된다.
    set에 NULL을 넣게 되면 현재 지정된 signal set을 oldset으로 부터 얻을수 있다 이때 how는 어떤것이라도 상관없음
And

File Lock 및 fcntl

|

#include <fcntl.h>
int fcntl (int filedes, int command, ...)

command
   --------- file lock 관련 command -----------
   1. F_GETLK      : flock에 대한 정보를 얻어온다
   2. F_SETLK      : flock에 정보로 셋팅한다
   3. F_GETLKW   : F_GETLK과 같지만 Lock있으면 Wait
   4. F_SETLKW   : F_SETLK과 같지만 Lock있으면 Wait

   --------- 그 외 command -----------
   5. F_DUPFD     : dup, dup2의 기능을 수행한다
   6. F_GETFD     : FD_CLOEXEC에 대한 file descriptor의 특성을 얻어온다 (dup을하면 file status flag는 공유되지만 file descriptor flags는 각자 다르다)
   7. F_SETFD     : FD_CLOEXEC에 대한 특성을 셋팅할 수 있다 (셋팅되어있으면 exec를 통해서 실행될 때 해당 fd는 닫힌다)
   8. F_GETFL     : file status flag를 얻어온다
   9. F_SETFL     : file status flag를 셋팅한다 (access mode는 변경 불가능)

struct flock {
   short int l_type;       // F_RDLCK, F_WRLCK, F_UNLCK
   short int l_whence; // SEEK_SET, SEEK_CUR, SEEK_END
   off_t l_start;            // start position of fd
   off_t l_len;              // 0일 경우 전체
   pid_t l_pid;             // F_GETLK 에서만 사용가능 lock걸은 process의 pid
}

## 예제 : 파일락걸기
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;

fcntl (fd, F_SETLKW, &lock);

## 예제 : 파일락풀기
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;

fcntl (fd, F_SETLK, &lock);


## 예제 : 파일락정보 가져오기
struct flock lock;
fcntl (fd, F_GETLK, &lock);
And

shared memory

|

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmget (key_t key, size_t size, int shmflg);
void *shmat (int shm_id, const void * shm_addr, int shmflg);
int shmctl (int shm_id, int cmd, struct shmid_ds *buf);
int shmdt (const void * shm_addr);

  1. shmget : int shmget (key_t key, size_t size, int shmflg)
    1. 공유메모리 세그먼트를 size만큼 만든 후 공유메모리의 식별자를 반환한다
    2. key
      1. 공유메모리를 얻기위한 key (IPC_PRIVATE : 프로세스가 단독으로 사용하는 공유 메모리 식별자를 반환)
    3. size
      1. 할당할 공유메모리 사이즈 (PATESIZE로 round up해서 할당된다고 함)
    4. shmflg
      1. IPC_CREATE : 셋팅되어있으면 파일을 생성한다
      2. IPC_EXCL : IPC_CREATE와 같이 쓰이면 이미 파일이 존재하면 함수는 실패한다
  2. shmat : void *shmat (int shm_id, const void * shm_addr, int shmflg)
    1. shmget만으로는 공유메모리를 사용할 수 없다. shmat을 통해서 프로세스의 주소공간에 공유메모리를 연결한다
    2. shm_id
      1. shmget으로 부터 반환받은 식별자
    3. shm_addr
      1. 공유메모리공간이 맵핑될 공간 (일반적으로 NULL을 선택해서 시스템이 직접선택하게한다)
    4. shmflg
      1. SHM_RDONLY : 공유메모리를 읽기전용으로
      2. SHM_RND : shmaddr이 NULL 이 아닌 경우일때만 사용되면 shmaddr을 반올리하여 메모리 페이지 경계에 맞춘다
  3. shmdt
  4. shmctl




 

And

MySQLdb 사용하기

|

설치 단계 : mysql connector -> MySQL-python


1단계 : mysql connector설치하기

 http://dev.mysql.com/downloads/  에서 MySQL Connector/C 를 다운받아서 설치한다
 rmp버전이면 그냥설치하면되고 rpm버전이 아니라 compile된 버전이라면
 bin -> /usr/local/bin
 lib -> /usr/local/lib
 include -> /usr/local/include 로 옮긴다


2단계 : MySQL-python설치하기

 MySQL-python-1.2.2 을 설치한다
 http://sourceforge.net/projects/mysql-python/files/
 (만약에 설치하다 egg파일 다운로드 실패할경우 직접받아서 MySQL-python폴더에 위치시켜놓자)

 python setup.py build
 python setup.py install


3단계 : 확인

 import MySQLdb 성공하면 OK!!

 

And

ssh시 Connection refused 에러 처리

|
ssh: connect to host 192.168.0.35 port 22: Connection refused
위와 같은 에러가 날경우 192.168.0.35 서버에 sshd가 떠있는지 점검한다
/etc/rc.init/sshd start 하게 되면 된다 (root계정으로)
And

scp암호 물어보지 않고 사용하기

|

scp 를 사용할 때 암호를 물어보게 되면 스크립트로 사용할때는 상당히 난감해진다
ssh는 공개키 개인키를 사용해서 통신하기 때문에
이러한 것을 제거하기 위해서는 상대방의 공개키를 적어놓으면 된다.
방법은 다음과같다.

예제: scp xxx 10.10.10.10:~
일경우 명령어를 친 서버의 홈디렉토리에
id_rsa.pub 안에서 공개키를 카피해서

10.10.10.10서버의 .ssh/authorized_keys파일에 추가한다
그러면 scp할때 암호를 물어보지 않는다


ssh 암호 생성하기
원하는 계정의 홈디렉토리에서
ssh-keygen -t rsa  명령어를 통해서 해당 계정에 암호를 만들 수 있다

And

에러로그남기는 함수

|

#include <stdio.h>
#include <stdarg.h>

void error_print (char * file, char * func, int line, const char * message, ...)
{
    va_list arg;

    fprintf (stderr, "FILE : %s\nFUNC :  %s\nLINE :  %d\nMESSAGE : ", file, func, line);
    va_start (arg, message);
    vfprintf (stderr, message, arg);
    va_end (arg);
}


param1 : __FILE__
param2 : __func__
param3 : __LINE__
param4 : printf형식의 문자열

And
prev | 1 | 2 | 3 | 4 | 5 | 6 | 7 | next