'분류 전체보기'에 해당되는 글 63건
- 2010.01.27 getopt
- 2010.01.22 세마포어
- 2010.01.21 Pid를 통해 process 정보 얻기
- 2010.01.21 sigaction
- 2010.01.20 File Lock 및 fcntl
- 2010.01.14 shared memory
- 2009.08.25 MySQLdb 사용하기
- 2008.10.29 ssh시 Connection refused 에러 처리
- 2008.10.29 scp암호 물어보지 않고 사용하기
- 2008.08.20 에러로그남기는 함수
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을 중단한다
사용법
#includechar 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]); }
#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.
}
예)
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; |
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는 어떤것이라도 상관없음
#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);
#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);
- shmget : int shmget (key_t key, size_t size, int shmflg)
- 공유메모리 세그먼트를 size만큼 만든 후 공유메모리의 식별자를 반환한다
- key
- 공유메모리를 얻기위한 key (IPC_PRIVATE : 프로세스가 단독으로 사용하는 공유 메모리 식별자를 반환)
- size
- 할당할 공유메모리 사이즈 (PATESIZE로 round up해서 할당된다고 함)
- shmflg
- IPC_CREATE : 셋팅되어있으면 파일을 생성한다
- IPC_EXCL : IPC_CREATE와 같이 쓰이면 이미 파일이 존재하면 함수는 실패한다
- shmat : void *shmat (int shm_id, const void * shm_addr, int shmflg)
- shmget만으로는 공유메모리를 사용할 수 없다. shmat을 통해서 프로세스의 주소공간에 공유메모리를 연결한다
- shm_id
- shmget으로 부터 반환받은 식별자
- shm_addr
- 공유메모리공간이 맵핑될 공간 (일반적으로 NULL을 선택해서 시스템이 직접선택하게한다)
- shmflg
- SHM_RDONLY : 공유메모리를 읽기전용으로
- SHM_RND : shmaddr이 NULL 이 아닌 경우일때만 사용되면 shmaddr을 반올리하여 메모리 페이지 경계에 맞춘다
- shmdt
- shmctl
설치 단계 : 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!!
위와 같은 에러가 날경우 192.168.0.35 서버에 sshd가 떠있는지 점검한다
/etc/rc.init/sshd start 하게 되면 된다 (root계정으로)
scp 를 사용할 때 암호를 물어보게 되면 스크립트로 사용할때는 상당히 난감해진다
ssh는 공개키 개인키를 사용해서 통신하기 때문에
이러한 것을 제거하기 위해서는 상대방의 공개키를 적어놓으면 된다.
방법은 다음과같다.
예제: scp xxx 10.10.10.10:~
일경우 명령어를 친 서버의 홈디렉토리에
id_rsa.pub 안에서 공개키를 카피해서
10.10.10.10서버의 .ssh/authorized_keys파일에 추가한다
그러면 scp할때 암호를 물어보지 않는다
ssh 암호 생성하기
원하는 계정의 홈디렉토리에서
ssh-keygen -t rsa 명령어를 통해서 해당 계정에 암호를 만들 수 있다
#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형식의 문자열