« Previous : 1 : ... 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : ... 33 : Next »

Unix Error code 설명

2008/02/24 23:14 / Resource
#define EPERM 1 /* Not super-user */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Arg list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No children */
#define EAGAIN 11 /* Resource temporarily unavailable */
#define ENOMEM 12 /* Not enough core */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Mount device busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Inappropriate ioctl for device */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math arg out of domain of func */
#define ERANGE 34 /* Math result not representable */
#define ENOMSG 35 /* No message of desired type */
#define EIDRM 36 /* Identifier removed */
#define ECHRNG 37 /* Channel number out of range */
#define EL2NSYNC 38 /* Level 2 not synchronized */
#define EL3HLT 39 /* Level 3 halted */
#define EL3RST 40 /* Level 3 reset */
#define ELNRNG 41 /* Link number out of range */
#define EUNATCH 42 /* Protocol driver not attached */
#define ENOCSI 43 /* No CSI structure available */
#define EL2HLT 44 /* Level 2 halted */
#define EDEADLK 45 /* Deadlock condition. */
#define ENOLCK 46 /* No record locks available. */
#define ECANCELED 47 /* Operation canceled */
#define ENOTSUP 48 /* Operation not supported */

/* Filesystem Quotas */
#define EDQUOT 49 /* Disc quota exceeded */

/* Convergent Error Returns */
#define EBADE 50 /* invalid exchange */
#define EBADR 51 /* invalid request descriptor */
#define EXFULL 52 /* exchange full */
#define ENOANO 53 /* no anode */
#define EBADRQC 54 /* invalid request code */
#define EBADSLT 55 /* invalid slot */
#define EDEADLOCK 56 /* file locking deadlock error */

#define EBFONT 57 /* bad font file fmt */

/* Interprocess Robust Locks */
#define EOWNERDEAD 58 /* process died with the lock */
#define ENOTRECOVERABLE 59 /* lock is not recoverable */

/* stream problems */
#define ENOSTR 60 /* Device not a stream */
#define ENODATA 61 /* no data (for no delay io) */
#define ETIME 62 /* timer expired */
#define ENOSR 63 /* out of streams resources */

#define ENONET 64 /* Machine is not on the network */
#define ENOPKG 65 /* Package not installed */
#define EREMOTE 66 /* The object is remote */
#define ENOLINK 67 /* the link has been severed */
#define EADV 68 /* advertise error */
#define ESRMNT 69 /* srmount error */

#define ECOMM 70 /* Communication error on send */
#define EPROTO 71 /* Protocol error */

/* Interprocess Robust Locks */
#define ELOCKUNMAPPED 72 /* locked lock was unmapped */

#define EMULTIHOP 74 /* multihop attempted */
#define EBADMSG 77 /* trying to read unreadable message */
#define ENAMETOOLONG 78 /* path name is too long */
#define EOVERFLOW 79 /* value too large to be stored in data type */
#define ENOTUNIQ 80 /* given log. name not unique */
#define EBADFD 81 /* f.d. invalid for this operation */
#define EREMCHG 82 /* Remote address changed */

/* shared library problems */
#define ELIBACC 83 /* Can't access a needed shared lib. */
#define ELIBBAD 84 /* Accessing a corrupted shared lib. */
#define ELIBSCN 85 /* .lib section in a.out corrupted. */
#define ELIBMAX 86 /* Attempting to link in too many libs. */
#define ELIBEXEC 87 /* Attempting to exec a shared library. */
#define EILSEQ 88 /* Illegal byte sequence. */
#define ENOSYS 89 /* Unsupported file system operation */
#define ELOOP 90 /* Symbolic link loop */
#define ERESTART 91 /* Restartable system call */
#define ESTRPIPE 92 /* if pipe/FIFO, don't sleep in stream head */
#define ENOTEMPTY 93 /* directory not empty */
#define EUSERS 94 /* Too many users (for UFS) */

/* BSD Networking Software */
/* argument errors */
#define ENOTSOCK 95 /* Socket operation on non-socket */
#define EDESTADDRREQ 96 /* Destination address required */
#define EMSGSIZE 97 /* Message too long */
#define EPROTOTYPE 98 /* Protocol wrong type for socket */
#define ENOPROTOOPT 99 /* Protocol not available */
#define EPROTONOSUPPORT 120 /* Protocol not supported */
#define ESOCKTNOSUPPORT 121 /* Socket type not supported */
#define EOPNOTSUPP 122 /* Operation not supported on socket */
#define EPFNOSUPPORT 123 /* Protocol family not supported */
#define EAFNOSUPPORT 124 /* Address family not supported by */
/* protocol family */
#define EADDRINUSE 125 /* Address already in use */
#define EADDRNOTAVAIL 126 /* Can't assign requested address */
/* operational errors */
#define ENETDOWN 127 /* Network is down */
#define ENETUNREACH 128 /* Network is unreachable */
#define ENETRESET 129 /* Network dropped connection because */
/* of reset */
#define ECONNABORTED 130 /* Software caused connection abort */
#define ECONNRESET 131 /* Connection reset by peer */
#define ENOBUFS 132 /* No buffer space available */
#define EISCONN 133 /* Socket is already connected */
#define ENOTCONN 134 /* Socket is not connected */
/* XENIX has 135 - 142 */
#define ESHUTDOWN 143 /* Can't send after socket shutdown */
#define ETOOMANYREFS 144 /* Too many references: can't splice */
#define ETIMEDOUT 145 /* Connection timed out */
#define ECONNREFUSED 146 /* Connection refused */
#define EHOSTDOWN 147 /* Host is down */
#define EHOSTUNREACH 148 /* No route to host */
#define EWOULDBLOCK EAGAIN
#define EALREADY 149 /* operation already in progress */
#define EINPROGRESS 150 /* operation now in progress */

/* SUN Network File System */
#define ESTALE 151 /* Stale NFS file handle */
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
Posted by 소리나는연탄.

Leave your greetings here.

  
  
  
  
  
  
  
  
 
출처 : IBM 기술정보 사이트

TCP는 UDP와는 달리 connection-oriented protocol인 관계로, 연결을 맺거나 특히 끊을 때,

많은 확인 절차를 거치게 됩니다. 이로 인하여, server와 client 간에 약간의 overhead가 있을

수 있습니다. 특히, web server로 사용되는 system의 경우, 대부분의 client들이 그리 안정적

이지 않은 PC client이므로, connection을 맺던 client application이 crash되는 경우 web serve

r에는 다소간의 문제가 발생할 여지가 있습니다. 가장 대표적인 문제가 FIN_WAIT_2 상태입

니다. 이 상태가 무엇을 뜻하는지, 이로 인해 어떤 문제가 있을 수 있는지, 또 그에

대한 대책은 무엇인지 설명토록 하겠습니다.

TCP socket connection 상태의 종류 

다음은 RFC 793 에 나와있는 그림으로, TCP connection을 맺고 있는 두 system이 정상적으로 connection을 끝내는 과정을 보여줍니다.

TCP A                TCP B
1. ESTABLISHED    ESTABLISHED

2. (Close)
 FIN-WAIT-1 → <SEQ=100><ACK=300><CTL=FIN,ACK>  → CLOSE-WAIT

3. FIN-WAIT-2 ← <SEQ=300><ACK=101><CTL=ACK>  ← CLOSE-WAIT

4. (Close) 
 TIME-WAIT ← <SEQ=300><ACK=101><CTL=FIN,ACK>  ← LAST-ACK

5. TIME-WAIT → <SEQ=101><ACK=301><CTL=ACK>  → CLOSED

6. (2 MSL)   
 CLOSED

Normal Close Sequence

먼저, A가 connection을 close 하면서, 종료 신호인 FIN segment를 A가 B로 보내고, A는 FIN-

WAIT-1 상태로 들어갑니다. 이 상태에서는 A system의 user는 더 이상의 SEND는 사용할 수

없게 되지만, RECEIVE는 계속 가능합니다. B가 그 신호를 받으면 B는 CLOSE-WAIT에 들어가

면서 그에 대한 acknowledge를 보내옵니다. A는 이를 받으면 FIN-WAIT-2 상태가 되고, B는

connection을 close하면서 자신의 FIN을 보냅니다. 이 때 A는 TIME-WAIT 상태가 되어 최종적

으로 B와의 connection이 닫히는지 확인하게 됩니다. 즉, server가 client로부터 FIN에 대한

ACK을 받고나서, client의 FIN을 기다리는 상태가 FIN-WAIT-2 상태입니다. 문제는,

이 FIN-WAIT-2 상태에 대해서는 원래 time-out 값이 정해져 있지 않아서, client가 FIN을 보내

오기 전에 client의 application이나 client 자체가 crash되는 경우, 또는, client program이나

server program에 bug가 있어서 이를 제대로 처리 못하는 경우에는, server에 남아있을

FIN-WAIT-2 상태는 server가 rebooting하기 전에는 끝까지 남아 있게 된다는 것입니다.

이는 netstat -a 명령어로 확인해 볼 수 있는데, 이러한 상태의 connection이 많이 쌓이다보

면 문제를 일으킬 수도 있습니다.

FIN_WAIT_2 에 대한 대책 

가장 좋은 해결책은 bug가 있는 client 또는 server program을 수정하는 것입니다. 대부분의

문제는 그 문제로부터 발생하기 때문입니다. Server에서 운영되는 가장 대표적인 application

은 Apache webserver일 것입니다. Apache는 이 문제에 대한 해결책으로 lingering_close() 함

수 대신 SO_LINGER 함수를 사용하도록 권하기도 합니다. (자세한 것은 아파치 홈페이지

www.apache.org를 참조하시기 바랍니다.) 다른 UNIX들은 FIN-WAIT-2에 대해, time-out 값

을 지정함으로써 이 문제를 회피하도록 해줄 수 있게 해주기도 합니다. Solaris, HP/UX, Linux

등 많은 OS가 이러한 기능을 제공합니다. 이것들은 RFC 793을 위반하는 것입니다만, 필요에

의해 각 vendor가 제공하는 것입니다. AIX는 (다른 UNIX와 마찬가지로) TCP keepalive timer

를 제공함으로써 이 문제를 해결합니다.

# no -a | grep tcp_keep
tcp_keepintvl = 150
tcp_keepidle = 14400

위의 값이 default 값이며, 이 경우, 150 * 500ms clock tick = 75 초, 그리고 14400 * 500ms

clock tick = 2 시간이 됩니다.

keepalive timer는 data segment를 보내면서 reset됩니다. 만약 주어진 tcp_keepidle tick

동안 아무 data segment도 보내지지 않았다면 먼저, 첫번째 keepalive probe packet이 보내

집니다.

이 packet에 대해 reply가 없을 경우, tcp_keepintvl에 정해진 tick만큼을 간격으로 하여, 추가

의 keepalive packet을 보내게 됩니다.

만약 이 keepalive에 대해 reply가 계속 없을 경우, 그 connection은 close됩니다. AIX 4.2에서

는 TCPTV_KEEPCNT (기본값 8)에 해당하는 개수의 probe에 대해 응답이 없을 경우 close되

는데, AIX 4.3에서는 이 no attribute가 없어졌습니다.

tcp_keepinit는 초기 연결시 응답이 없을 경우에 사용되는 값입니다. 따라서, 일단 connection

을 맺고 나서 발생하는 문제에 대해서는 적용되지 않습니다.

위에 따르면, FIN_WAIT_2가 발생하는 경우, default로 2시간 10분 후에야 그 connection이 c

lose되도록 되어 있습니다. 만약, 매우 busy한 web server인 경우에는 이 값들을 조절하는 것

이 필요할 수 있습니다.

참고로 첨부파일을 확인해 주시기 바랍니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
Posted by 소리나는연탄.

Leave your greetings here.

  
  
  
  
  
  
  
  
 

소개

확장성을 확보하기 위한 방법은 여러가지가 있을 것이다. 여기에서는 그중 PlugIn 방식을 이용한 확장성확보에 대한 내용을 다룰 것이다.

Agent&Manager 방식의 프로그램을 만든다고 가정해보자. SNMP 프로토콜을 응용한 Net SNMP가 가장 대표적인 경우가 될 것이다. 이왕 Net SNMP를 예로 들었으니, Agent&Manager 방식의 SMS을 만드는 것으로 가닥을 잡아보겠다.

이러한 시스템에서 Agent 프로그램을 만들려고 한다면, 설계단계에서 가장 중요하게 생각해야 할게 확장성의 확보가 될 것이다. 왜냐면 시스템 관리의 범위가 매우 넓은 관계로 필요에 따라 관리 요소가 계속 추가될 수 있기 때문이다. 당장 생각나는게, CPU, Memory, Disk 관리쯤이 될것이다. 물론 초기에 완전하게 관리요소를 몽땅 예상하고 설계를 하는 방법도 있겠지만, 그렇게 될 경우 설계에 지나치게 많은 시간을 소비해야 할 것이다. 막상 그렇게 만들었다고 해도, 중간쯤 만들다 보면 관리요소가 새로 추가될 수도 있다. 심지어는 모두 만들고 나서 관리요소가 추가될 수도 있을 것이다.

이러한 경우 PlugIn 방식으로 각각의 성능을 모듈화 시켜서 붙이는 방식으로 개발시간을 아낄 수 있다. 거기에 덤으로 유연하고 확장성 좋은 시스템을 만들 수도 있다. 대략 다음과 같은 시스템 구성을 가지게 된다.

agent.png

필요한 기술

이 문서를 읽기 위해서는 함수포인터, STL, 라이브러리를 제어하기 위한 기술들을 가지고 있어야 한다.

Dynamic Module Loading

동적으로 모듈을 로딩하는 PlugIn방식을 구현하기 위한 기본적인 기술요구 사항은 그리 복잡하지 않다. 동적라이브러리를 이용하면, 쉽게 구현할 수 있다. 이 경우 중요한 것은 모듈과 Agent와의 인터페이스를 통일하는게 될 것이다. 어떠한 기능이 모듈형태로 추가되더라도, Agent와 Manager의 소스코드 수정없이 모듈이 로딩될 수 있어야 하기 때문이다.

인터페이스 이름을 맞추는 것은 문제가 되지 않을 것이다. 문제는 인터페이스를 통해서 이동하는 데이터가 될것이다. 이는 각각의 성능마다 보여줘야 하는 정보가 다를 수 있기 때문인데, CPU의 경우라면 사용율을 Disk라면 장치명,마운트이름,사용율을 보내야 하기 때문이다. 그러므로 예상가능한 모든 종류의 데이터를 처리할 수 있는 방법이 준비되어야 한다. 이 문제는 세가지 정도의 방식으로 해결할 수 있다.
  1. 문자열 전송
    간단하게 문자열을 전송한다. 성능=값1,값2 정도로 보내면 될 것이다. 포맷은 대략 아래와 같을 것이다. 성능이름이 들어가는 이유는, 나중에 Manager로 정보가 전달되었을때, 성능이름을 Key로 해서, 해당되는 모듈을 Plugin 방식으로 로딩하기 위함이다.

    CPU=89
    DSK=/dev/sda1,/root,58
  2. 구조체전송
    구조체로도 전송이 가능하다. Agent는 데이터를 처리하지 않고, Manager로 보내기만 하면되므로, 구조체에 어떤 멤버변수들이 있는지는 알 필요가 없다. 단지 보내야 하는 구조체의 크기성능이름만 알고 있으면 된다. 구조체를 받은 Manager 측은 성능이름에 해당되는 Plugin 모듈을 로딩해서 구조체의 값을 처리하면 된다.

    struct Info
    {
    int size; // 구조체의 크기
    char id[4]; // 성능 이름 : DSK, CPU, MEM...
    ... // 나머지 정보들은 성능에 따라 달라질 수 있다.
    ...
    }
  3. XML 데이터 전송
    잘 정의한다면, 유연하게 사용할 수 있을 것이다. 데이터의 크기가 커진다는 점을 고려하지 않아도 된다면, 가장 좋은 방법이라고 생각된다.

여기에서는 문자열을 보내는 것을 기준으로 설명하도록 하겠다.

Module Config

이제 설정파일을 만들어야 한다. 이 설정파일은 Key라고 할 수 있는 모듈 ID와 호출해야할 라이브러리의 이름들을 가진다. 다음과 같은 구조를 가지도록 하겠다.
[plugin]
CPU=libmycpu.so
MEM=libmymem.so
설정파일을 읽을 수 있는 라이브러리가 필요할 것 같아서, 급조한 코드가 있다. 간단 설정파일 Reader를 참고하기 바란다. 이 코드를 그대로 사용할 것이다.

프로시져

  1. 실행
  2. plugin 을 로딩하기 위해서 설정파일을 읽어들인다.
  3. plugin 목록을 읽어들인다.
  4. plugin 목록의 갯수만큼 루프를 돌면서, 라이브러리를 동적으로 적재한다.
  5. while 루프를 돌면서, 공통 인터페이스를 호출한다.

공통 인터페이스

공통 인터페이스를 정의해보도록 하자. 최대한 간단하게 정의하도록 하겠다.
  1. Init : 플러그인 모듈을 초기화 한다.
  2. Read : 플러그인 모듈로 부터, 데이터를 요청한다. 데이터는 문자열로 Key.IndexNum=Value,Value 형식으로 전달된다. IndexNum은 데이터가 2개이상일때, 사용하는 인덱스 번호다. 예를 들어 CPU가 2개라면
    • CPU.1=87
    • CPU.2=21
  3. RowNum : 몇개의 데이터가 있는지를 알려준다.
    • CPU가 2개라면, 2를 출력한다.
  4. Close : 플러그인 모듈을 닫는다.

테스트용 플러그인 모듈

libmycpu 와 libmysms 를 위한 모듈을 작성할 것이다. 이들은 공유라이브러리 형태로 작성될 것이다. 작성된 이들 플러그인 모듈은 dlopen(2) 함수를 이용해서 동적으로 적재 된다.

여기에서는 단순히 문자열을 리턴하는 dummy 모듈을 작성할 것이다.

플러그인 기능을 지원하는 Agent 프로그램

다음은 Agent 프로그램이다.
#include <iostream>
#include <cstdlib>
#include <qosconfig.h>
#include <dlfcn.h>
#include <vector>

using namespace std;

typedef char *(*Function)();
int main(int argc, char *argv[])
{
Config *agentCfg;
int rtv;
char *key;
char *value;
void *handle;
agentCfg = new Config();
Function myFunc;
// 플러그인을 저장할 Vector로 함수 포인터를 원소로 가진다.
vector<Function> FuncPList;

// 설정파일을 Open 한다.
rtv = agentCfg->openCfg("config.cfg");
if (rtv == -1)
{
perror("Config Read Error");
}

// 플러그인 섹션에서 플러그인 목록을 읽어온다.
if (agentCfg->findSection("PLUGIN"))
{
while(key = agentCfg->NextItem())
{
printf("Loding Module %s:%sn", key, agentCfg->NextValue());
// 플러그인을 로드한다.
handle = dlopen(agentCfg->NextValue(), RTLD_NOW);
if (!handle)
{
fputs(dlerror(), stderr);
}
else
{
// 공통인터페이스인 Read 함수를 함수포인터로 얻어오고
// vector에 push 한다.
myFunc = (char *(*)())dlsym(handle, "Read");
FuncPList.push_back(myFunc);
}
}
}

// 1초 간격으로 로딩된 플러그인 모듈로 부터, 데이터를 읽어온다.
while(1)
{
for (int i = 0; i < FuncPList.size(); i++)
{
printf("%s",FuncPList());
}
printf("==============n");
sleep(1);
}
return EXIT_SUCCESS;
}

모듈 프로그램

이 프로그램은 dummy 프로그램으로, 공통 인터페이스 포멧에 맞는 문자열을 리턴한다.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

char *rtvstr = NULL;
int count;
int Init()
{
rtvstr = (char *)malloc(80);
count = 0;
return 1;
}

char *Read()
{
sprintf(rtvstr, "%s=%dn", count);
count++;
}

int RowNum()
{
return 1;
}

int Close()
{
if (rtvstr != NULL)
free(rtvstr);
count = 0;
}
이 코드는 공유라이브러리로 컴파일을 한다. 라이브러리의 이름은 libdummy.so 로 하겠다. 공유라이브러리를 만드는 방법은 라이브러리 만들기 문서를 참고하기 바란다.

이제 아래와 같은 설정파일 만들고, 실행하면 된다.
[PLUGIN]
DUMMY=libdummy.so

결론

동적라이브러리를 통한 확장가능한 프로그램을 만드는 방법에 대해서 알아보았다. 이 경우에는 데이터를 단순하게 제한했기 때문에, 비교적 손쉽게 인터페이스를 설계할 수 있었지만 실제 프로젝트에 도입해서 사용할때는 XML을 이용하거나, 데이터 처리 함수를 만들어야 하는 등, 좀더 복잡하게 구현될 수 있을 것이다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
Posted by 소리나는연탄.
TAGS ,

Leave your greetings here.

  
  
  
  
  
  
  
  
 

Unix Signal 처리

2008/02/03 00:31 / Resource
SIGPIPE signal 처리

* Scenario: server가 다른 작업을 수행중인 동안 client가 종료한 경우 client는 server로 FIN packet을 전송한다. server가 client가 종료한 것을 모르는 상태에서 socket에 write를 하는경우 client쪽 TCP는 RST packet을 전송한다. server가 RST packet을 수신한 상태에서 다시 socket에 write를 하는 경우 SIGPIPE signal을 받게된다.

* FIN packet을 수신한 상태에서 socket을 read 하는 경우: EOF(0)
* RST packet을 수신한 상태에서 socket을 read 하는 경우: error (ECONNRESET)

* FIN packet을 수신한 상태에서 socket에 write를 하는 경우는 error가 아니지만 RST packet을 수신한 상태에서 socket에 write를 하는 경우는 error (EPIPE)

* SIGPIPE signal 처리
- SIGPIPE signal을 ignore (SIG_IGN)한다.
- write에서 return 되는 error (EPIPE)를 처리한다.



SIGCHLD signal 처리
* fork를 사용하여 child process를 생성하는 경우 parent process는 child process를 wait하여 child process가 zombie가 되는 것을 막아야 한다. 일반적으로 SIGCHLD 처리 함수안에서 waitpid 함수를 사용하여 child process가 zombie가 되는 것을 막는다.

* waitpid함수의 pid value를 -1을 사용하면 종료된 첫번째 child process를 wait하며 WNOHANG option을 사용하면 종료된 child process가 없더라도 waitpid 함수에서 block되는 것을 막을 수 있다.

* accept, read, write, select, open 과 같은 함수를 호출하는 중간에 SIGCHLD signal을 받아 interrupt된 경우 EINTR errno를 받게되며 이러한 경우 다시 위의 함수를 호출하면 된다. 하지만, connect 함수를 호출하는 중간에 interrupt된 경우 socket함수부터 다시 시작해야 한다.

* accept 함수를 사용하는 경우 block되는 것을 방지하기 위해서는 listening socket을 nonblocking으로 setting하며 EWOULDBLOCK, ECONNABORTED, EPROTO, EINTR error는 무시한다.

* 출처: UNIX Network Programming V.1 by W. Richard Stevens




◈ SIGHUP
- 터미널 인터페이스에 의해 연결의 단절이 감지되면 해당 제어 터미널과 연결된 제어 프로세스(세션 리더)에게 전달
- 세션 리더가 종료했을 때도 발생하는데 이때는 foreground 프로세스 그룹내의 모든 프로세스들에게 전달
- SIGHUP 시그널은 원래 모뎀 연결 끊김 등의 시리얼 라인이 끊어지면 발생하는 시그널이다.
- 이름 있는 시스템 데몬들은 SIGHUP 시그널을 configure file을 다시 읽어들이는 등의 초기화 신호로 해석한다.
  . bootp(8), gated(8), inetd(8), mountd(8), named(8), nfsd(8), ypbind(8)
  . pppd(8) 처럼 SIGHUP을 원래의 의도에 충실하게 세션 종료의 뜻으로 받아들이는 사례도 간혹 있는데, 요새는 보편적으로 이 역할을 SIGTERM이 맡는다.
  . daemon은 제어 단말기 없이 돌기 때문에 kernel로부터 SIGHUP 신호를 수신하지 못한다.
    그러므로 많은 daemon은 이 신호를 daemon의 구성 파일이 변경되어 daemon이 그 파일을 새로 읽어야 된다는 것을 알려주는 관리자로부터의 통지로 사용한다.
  . daemon이 수신할 수 없는 다른 두 개의 신호로 SIGINT와 SIGWINCH가 있고 이들도 역시 어떤 변화를 daemon에게 통지하기 위해 사용될 수 있다.

◈ SIGINT
- 인터럽트 키 (DELETE 또는 Control-C)가 눌렸을 때 발생

◈ SIGQUIT
- Control-backslash 에 의해 발생

◈ SIGCHLD
- 프로세스가 종료하거나 정지하면, 부모 프로세스에게 전달된다.
- 부모 프로세스는 wait() 시스템 콜을 사용하여 무슨 일이 일어났는지 알아본다.
- 이 시그널에 대한 default 처리는 무시하는 것이다. 즉 프로세스가 이 신호를 받으려고 할 때만 전달된다.

◈ SIGSEGV
- 유효하지 않은 가상 메모리 주소를 참조하거나 사용 권한이 없는 메모리에 접근할 때 프로세스로 전달된다.

◈ SIGTERM
- kill 명령에 의해 기본적으로 발생

◈ SIGKILL
- "극단의 조치(extreme prejudice)"로 프로그램을 종료하는 데 사용된다.
- 시그널 catch 하거나 무시할 수 없다.

◈ SIGALRM
- alarm()이나 setitimer() 시스템 콜로 설정한 알람 시간이 초과 했을 때 프로세스로 전달된다.

◈ SIGTSTP
-
Control-Z 키에 의해 발생
- 기본 처리 방법은 SIGCONT 신호를 받을 때까지 프로세스를 중단한다.

◈ SIGCONT
-
정지한 프로세스를 계속 실행시키려 할 때 발생
- 이 신호는 받을 수 있지만 블록하거나 무시할 수 없다.
- 기본 처리 방법은 중단된 프로세스를 재시작하는 것이다. 그러나 프로세스가 신호를 받지 않는다면 신호를 버린다.
- vi 에디터를 사용할 때
. Control-Z 를 눌러 수행을 잠시 정지시키면 쉘이 키 입력을 처리하게 되는데
. 이때 fg 명령을 실행시키면 쉘은 vi 에게 SIGCONT 시그널을 전달하며
. vi는 이 시그널에 대한 처리로 화면을 다시 그리고 사용자 키 입력을 받는 상태로 돌아간다.

◈ SIGSTOP
-
SIGTSTP과 동일하나 catch 하거나 무시할 수 없다.
- 이 신호를 받으면 무조건 SIGCONT 신호를 받을 때까지 프로세스를 중단한다.

◈ SIGABRT
-
abort() 함수의 호출로 발생

◈ SIGBUS
-
하드웨어 결함으로 발생

◈ SIGEMT
-
하드웨어 결함으로 발생

SIGFPE
-
divide-by-0나 부동 소숫점 오버플로우와 같은 산술 연산 오류에서 발생

◈ SIGILL

◈ SIGINFO

◈ SIGIO

◈ SIGIOT

◈ SIGPIPE
-
pipe 통신에서 수신 프로세스가 종료했을 때 송신 프로세스가 파이프에 write 하면 발생
- 프로세스가 RST를 받은 소켓에 데이터를 쓰면, 커널은 그 프로세스에 ISGPIPE 신호를 보낸다.
- 이 신호의 기본 동작은 프로세스를 종료시키는 것이므로, 프로세스가 원하지 않는 종료를 피하기 위해서는 이 신호를 포착해야 한다.

◈ SIGPOLL

◈ SIGROF

◈ SIGPWR

◈ SIGSYS

◈ SIGTTIN
-
background에 있는 프로세스가 제어 터미널로부터의 읽기를 시도한다.

◈ SIGTTOU
-
background에 있는 프로세스가 제어 터미널로부터의 쓰기를 시도한다.

◈ SIGURG
-
SIGIO와 SIGURG 라는 두 개의 신호는 소켓이 F_SETOWN 명령으로 소유주에게 할당되었을 때만 소켓에 대해 발생한다.

◈ SIGUSR1

◈ SIGUSR2

◈ SIGVTALRM

◈ SIGWINCH

◈ SIGXCPU

◈ SIGXFSZ
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
Posted by 소리나는연탄.
TAGS ,

Leave your greetings here.

  
  
  
  
  
  
  
  
 
SQLCA (SQL Communication Area)

1. 정의
    ⊙ 프로그램내에서 각각의 SQL 실행문이 처리 될때마다 발생하는
         상황처리를
       RETURN해주는 ORACLE 제공의 통신 영역.

2. 사용법
    ⊙ "EXEC SQL INCLUDE sqlca.h"
    ⊙ Global SQLCA는 1개만 지정 가능하며, 트랜잭션에 의해 리턴된
        정보를 보존하기 위해, 각각의 루틴에서 "로컬변수"로 각각의
        SQLCA를 사용할 수도 있다.

3. 구조

      ⊙ struct sqlca {
              char sqlcaid[8];
              long sqlcabc;
              long sqlcode;
              struct {
                 unsigned short sqlerrm1;
                 char sqlerrmc[70]
              } sqlerrm;
              char sqlerrp[8];
              long sqlerrd[6];
              char sqlwarn[8];
              char sqlext[8];
       };
       struct sqlca sqlca;

4. 기능설명

    ⊙ sqlca.sqlcaid
       : 문자열. 이 필드는 글로벌 구조로서 사용하는 경우에
         한해서, 할당시에 "SQLCA"로 초기화 된다.

    ⊙ sqlca.sqlcabc
       : 4바이트 2진정수. 이필드에는 SQLCA 구조 자신의 길이가
         바이트로 설정된다.

    ⊙ sqlca.sqlcode
       : 4바이트 2진정수. 이필드에는 SQL문의 실행결과를 나타낸다.

       ▶ Zero(0) : 실행이 정상으로 종료한 것을 나타낸다.
       ▶ 양수 : 상태코드와 함께 실행이 성공한 것을 나타냄.
                 현재의 경우 양의 코드는 '1403'뿐이며, 이것은
                 "행이 발견되지 않는다" 또는 마지막 행이 리턴된
                 것을 나타냄.
       ▶ 음수 : 프로그램내의 에러 또는 시스템 장애를 나타냄.
                 : "오라클 에러 메세지 및 코드" 편 참조

    ⊙ sqlca.sqlerrm.sqlerrml
       :sqlca.sqlerrm.sqlerrmc의 텍스트의 길이를 나타낸다.

    ⊙ sqlca.sqlerrm.sqlerrmc
       : 가변길이의 문자열이고, sqlca.sqlcode내에 표시된
         에러번호에 대응하는 에러 메세지의 내용.

    ⊙ sqlca.sqlerrp
       : 현재의 경우는 사용하지 않는다. 이 필드는 문자열이다.

    ⊙ sqlca.sqlerrd
       : 4바이트 2진정수 6개로 된 배열이고, ORACLE RDBMS의 내부
         상황을 파악하기위해 사용한다.
         3번째의 요소[2]만이 사용되고 있고, INSERT나 UPDATE처럼
         DML 처리에 대해서 몇개의 행이 처리됐는지를 나타낸다.
       : 요소 0,1,3,4,5는 현재의 경우 사용되고 있지 않다.
       : 인포믹스에서 sqlca.sqlerrd[1]의 값은 insert 후의 serial
         값이 됩니다.

    ⊙ sqlca.sqlwarn
       : 1문자의 요소 8개로 구성된 구조이다.
       : 이들의 요소는 Pre-Compile중에 발생한 여러가지 상황에 대한
         경고를 나타낸다.
         예를 들면, ORACLE이 평균치의 계산에서 NULL을 무시한 경우
         등에 경고가 설정된다. 이 경우는 대응하는 요소의 값이 "W"로
         된다.
       : 첫번째 요소 [0]은 항상 "W"가 된다.

       ▶ sqlca.sqlwarn[0]
          : 그 문에 대해 경고가 1개도 설정되지 않았음을 나타냄.
          : sqlca.sqlwarn[0]에 "W"가 설정되어 있는 경우 1개 이상의
            경고가 설정되어 있는 것이므로 검사해야 한다. 치며적인
            에러는 아니지만 검사해야 할 문제나
            상황이 있음을 나타냄.

       ▶ sqlca.sqlwarn[1]
          : sqlca.sqlwarn[0]에 "W"가 설정되어 있는 경우, 호스트
            변수의 폭이 충분하지않기 때문에 리턴된 문자 필드가 1개
            이상 절사 되었음을 나타냄.
          : 이것은 문자 데이터에 대해서만 적용하며, 수치타입 데이터
            에 대해서는 경고를 설정하거나, 음의 sqlca.sqlcode를
            리턴하지 않고서 절사를 행함.

       ▶ sqlca.sqlwarn[2]
          : sqlca.sqlwarn[2]에 "W"가 설정되어 있는 경우, AVG, SUM,
            MIN, MAX등의 함수 계산에서 1개 이상의 NULL이 무시되었음
            을 보여줌.

       ▶ sqlca.sqlwarn[3]
          : sqlca.sqlwarn[3]에 "W"가 설정되어 있는 경우, SELECT 리스
            트내의 항목수가 INTO구의 호스트 변수 갯수와 같지 않음을
            보여줌.
          : 데이터는 리턴되지만, 리턴되는 항목의 수는 적은 쪽에
            일치함.

       ▶ sqlca.sqlwarn[4]
          : sqlca.sqlwarn[4]에 "W"가 설정되어 있는 경우, UPDATE또는
            DELETE문에 WHERE구가 지정되지 않았음을 보여줌. 즉
            어느행을 갱신.삭제할지 한정되지 않았기 때문에 테이블내
            의 모든 행이 갱신.삭제됨을 의미하며, ORACLE은
            확인 또는 롤백에 대한 경고를 설정하여 줌.
           
       ▶ sqlca.sqlwarn[5]
          : sqlca.sqlwarn[5]는 현재 사용하고 있지 않음.

       ▶ sqlca.sqlwarn[6]
          : sqlca.sqlwarn[6]에 "W"가 설정되어 있는 경우, 실행된
            SQL문에 의해 ORACLE 이 논리적 작업단위의 롤백을 행한
            경우에 해당된다.
          : Deadlock에 의한 트랜잭션의 Rollback.

       ▶ sqlca.sqlwarn[7]
          : sqlca.sqlwarn[7]에 "W"가 설정되어 있는 경우, 행의 현재
            데이터가 Query 와는 모순되는 데이터의 경우 혹은 행의
            현재 데이터가 이 Query의 시작
            후에 삭제된 경우등에 해당된다.

   ⊙ sqlca.sqlext
       : SQLCA의 마지막 필드인 sqlca.sqlext는 현재 사용되지 않고
         있음.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
Posted by 소리나는연탄.

Leave your greetings here.

  
  
  
  
  
  
  
  
 
« Previous : 1 : ... 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : ... 33 : Next »