출처 - http://egloos.zum.com/wingh/v/4082857

 

Out(외부) Join

 - equijoin 문장들의 한가지 제약점은 그것들이 조인을 생성하려 하는 두 개의 테이블의 두 개
    컬럼에서 공통된 값이 없다면 테이블로부터 테이터를 Return하지 않는 다는 것입니다.

 - 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 outer join을 사용합니다.
    Outer join 연산자 "( + )"입니다.

 -조인시킬 값이 없는 조인측에 "( + )"를 위치 시킵니다.


 - Outer join 연산자는 표현식의 한 편에만 올 수 있습니다.


예제1) 일반 조인의 경우

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno = b.deptno

DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30


예제2)out join을 했을 경우


SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

 DEPTNO     DEPTNO
 -------     ----------
     10         10
     20         20
     30         30
                 40

※ 다음의 쿼리를 한번 잘 보시기 바랍니다.

SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

               ANDa.ename LIKE '%';

    DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30

쿼리 결과를 잘 보면 out조인이 되지 않은 것을 알 수 있습니다.
위 쿼리를 out조인이 되기 위해서는 아래와 같이 고쳐야 합니다
.

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno(+) = b.deptno
              AND a.ename(+) LIKE '%'

    DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30
                    40

OUT조인 조건이 걸려있는 테이블에는 다른 조건절이 들어와도
똑같이 OUT조인 연산자인 (+)를 해주어야 합니다.  



Oracle9i 부터는 ANSI/ISO SQL표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN를 지원 합니다.


LEFT OUTER JOIN
 왼쪽 테이블에 조인시킬 컬럽의 값이 없는 경우 사용합니다.
 
SQL>SELECT DISTINCT(e.deptno), d.deptno
    FROM dept d LEFT OUTER JOIN emp e
    ON d.deptno = e.deptno;
 
 
RIGHT OUTER JOIN
 - 오른쪽에 테이블에 조인시킬 컬럽의 값이 없는 경우 사용합니다.
 
SQL>SELECT DISTINCT(a.deptno), b.deptno
    FROM emp a RIGHT OUTER JOIN dept b
    ON a.deptno = b.deptno;
 
 
FULL OUTER JOIN
양쪽 테이블에 다 outer join을 거는것을 TWO-WAY OUTER JOIN 또는 FULL OUTER JOIN이라 합니다.
 
SQL>SELECT DISTINCT(a.deptno), b.deptno
    FROM emp a FULL OUTER JOIN dept b
    ON a.deptno = b.deptno;
 
-- 위 세 문장의 결과는 아래와 같습니다.
    DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30
                   40
 
LEFT OUTER JOIN과 RIGHT OUTER JOIN의 테이블 순서를 바꾸어 가면서 테스트를 하시면 쉽게 이해를 하실 수 있습니다.

출처 : 오라클 클럽

'IT > DB' 카테고리의 다른 글

[Oracle] pro*c 란 - 초보자를 위한 개념 설명  (10) 2016.05.13
[DB] order by 1의 뜻  (0) 2016.04.25
[DB] oracle NVL함수  (0) 2016.04.25
[Oracle] Grouping(), ROLLUP, CUBE Study 정리  (0) 2016.04.22
-펌-[DB]SQL / MySQL 서브쿼리(SubQuery)  (0) 2016.04.06

1. NVL함수 : 해당 컬럼의 null 값을 다른 값으로 치환해주는 함수
    NVL(value,1) 
     -> value가 null 일경우 1을 반환
                     그렇지 않을경우 value값을 반환

출처 - http://fly32.net/252

 

/****************************************************************
  작성자 : 삼이
  작성일 : 2004-09-30
  제  목 : Grouping(), ROLLUP, CUBE Study 정리
 ****************************************************************/


* ROLLUP 연산자
 - GROUP BY절에 있는 컬럼들을 오른쪽에서 왼쪽의 차례로 그룹들을 생성하고,
   각 그룹에 계산함수를 적용한다.
 - GROUP BY절의 결과는 누적 계산 결과이다.
 

* CUBE 연산자
 - GROUP BY절에 있는 모든 컬럼들에 대한 가능한 모든 조합을 그룹으로 생성한다.
 

* GROUPING 함수
 - 각 결과 행이 CUBE, ROLLUP 연산자들에 의해 계산된 것인지를 알기 위해 사용된다.
 - 해당컬럼에 대해 계산되었다면 0, 그렇지 않다면(컬럼값이 NULL) 1을 반환한다.
 - GROUP BY절에 나타나는 컬럼에 적용된다.


 

사용 예)

  -- table생성(사원이름,급여,부서,직위,입사년도)
  CREATE TABLE roll_test (
    name   VARCHAR2(10),
    sal    NUMBER,
    dept   VARCHAR2(10),
    duty   VARCHAR2(10),
    entYear NUMBER(4)
  );

INSERT INTO roll_Test VALUES('kim' , 1000, 'AA', '00', 2004);
INSERT INTO roll_Test VALUES('no' , 1500, 'AA', '00', 2004);
INSERT INTO roll_Test VALUES('choi', 2000, 'BB', '02', 2003);
INSERT INTO roll_Test VALUES('park', 2000, 'BB', '02', 2003);
INSERT INTO roll_Test VALUES('lee' , 3000, 'CC', '03', 2002);
INSERT INTO roll_Test VALUES('cho' , 4000, 'AA', '04', 2001);
INSERT INTO roll_Test VALUES('lyu' , 4000, 'DD', '04', 2001);
INSERT INTO roll_Test VALUES('ham' , 4000, 'AA', '04', 2001);
INSERT INTO roll_Test VALUES('kang', 7000, 'DD', '05', 2001);
COMMIT;

SELECT * FROM roll_Test;


 

-- 1. 각 부서에 대한 급여 소계를 구하고, 총계를 구하라
--    (하나의 Column Grouping)

-----일반-----------
SELECT dept, SUM(sal)
FROM   roll_Test
GROUP BY dept;
---------------------

----- ROLLUP ---------
SELECT dept, SUM(sal), GROUPING(dept)
FROM   roll_Test
GROUP BY ROLLUP(dept);
-----------------------

----- CUBE ----------
SELECT dept, SUM(sal), GROUPING(dept)
FROM roll_Test
GROUP BY CUBE(dept);
-----------------------

-- 일반적인 GROUP BY를 사용할 경우 급여 소계만 나오고, 총계는 따로 구해야 함
-- ROLLUP과 CUBE 차이점 없음


 

-- 2. 각 부서별, 직위별 급여 소계를 구하고, 총계를 구하라
--    (두개의Column Grouping)

-----NORMAL-----------
SELECT dept, duty, SUM(sal)
FROM   roll_Test
GROUP BY dept, duty;
-----------------------

----- ROLLUP ----------
SELECT dept, duty, SUM(sal), GROUPING(dept), GROUPING(duty)
FROM   roll_Test
GROUP BY ROLLUP(dept, duty);
-----------------------

----- CUBE ----------
SELECT dept, duty, SUM(sal), GROUPING(dept), GROUPING(duty)
FROM   roll_Test
GROUP BY CUBE(dept, duty);
-----------------------

-- ROLLUP은 부서에 대한 소계 / 부서에 대한 직위별 소계만 볼 수 있고,
-- CUBE는 부서에 대한 소계 / 부서에 대한 직위별 소계 / 직위별 소계를 볼 수 있음
-- GROUP BY 내의 왼쪽 컬럼부터 자동으로 오름차순 정렬 됨


-- 3. 각 부서별, 직위별, 입사년도별 급여 소계를 구하고, 총계를 구하라
--    (세개의 Column Grouping)

-----NORMAL-----------
SELECT dept, duty, entYear, SUM(sal)
FROM   roll_Test
GROUP BY dept, duty, entYear;
-----------------------

----- ROLLUP ----------
SELECT dept, duty, entYear, SUM(sal), GROUPING(dept), GROUPING(duty), GROUPING(entYear)
FROM   roll_Test
GROUP BY ROLLUP(dept, duty, entYear);
-----------------------

----- CUBE ----------
SELECT dept, duty, entYear, SUM(sal), GROUPING(dept), GROUPING(duty), GROUPING(entYear)
FROM   roll_Test
GROUP BY CUBE(dept, duty, entYear);
-----------------------


- ROLLUP 사용시 3개의 소계와 1개의 총계를 구할 수 있음
  (부서별, 부서*직위별, 부서*직위*입사년도별, 총계)
  ※ GROUP BY 내의 가장 왼쪽 컬럼을 기준으로 하여 순차적으로 하위 그룹 생성

- CUBE 사용시 7개의 소계와 1개의 총계를 구할 수 있음.
  (부서별, 직위별, 입사년도별, 부서*직위별, 부서*입사년도별, 직위*입사년도별, 부서*직위*입사년도별, 총계)
  ※ 생성 가능한 모든 경우를 그룹 생성
 


사용 예)

* 부서에 대한 소계를 보고 싶을 때
HAVING GROUPING(dept) = 0 AND GROUPING(duty) = 1
AND GROUPING(entYear) = 1;

* 각 부서에 대한 직위별 소계를 보고 싶을 때
HAVING GROUPING(dept) = 0 AND GROUPING(duty) = 0
AND GROUPING(entYear) = 1;

출처 - http://romantech.net/510

 

어제 XP에서 드디어 윈도우7로 갈아탔습니다. 컴퓨터를 새로 업글해서 그럴 수도 있지만, 체감속도가 무지 빠르네요.. 비스타의 짜증나는 uac기능은 설정을 통해 죽여줄 수 있고, 암튼 전체적으로 대만족입니다. 22일날 한글판이 나온다더니 아직 별다른 소식이 없네요, 그대신 오늘 날짜로 각종 정식 언어팩이 공개 되었다고 합니다. 뭐 전 이미 설치했으니'.' RTM 버전과 정식 버전은 별반 다를게 없습니다, 그냥 기분상으로 개인의 손을 거치지 않은 MS 순수버전이란 명목상일 뿐 기본적인건 다 똑같습니다. 그래서 전 별다른 문제가 없을경우 RTM버전을 쭈욱 이용할까 합니다. 구글링을 통해서 윈도우 7 팁을 찾아보았는데 정리해서 올려볼까 합니다. 윈도우 7에 관한 팁들은 스누피님 블로그에 무지 많더군요, 저두 스누피님 블로그에서 많이 참조했습니다.


 

관리자 계정으로 로그인

 


▲ 시작 -> 검색 창에 명령 프롬포트 입력 -> 오른쪽 클릭 -> 관리자 권한으로 실행 클릭



▲ net user administrator /active:yes 를 입력합니다. 입력하기 귀찮은 분들은 그냥 복사하신 뒤 마우스 오른쪽 클릭 후 붙여넣기를 해주시면 됩니다. "명령을 잘 실행했습니다." 라는 문구가 나오면 정상적으로 진행된 것 입니다. net user administrator /active:no 반대로 로그아웃을 해주는 명령어 입니다.



▲ 그 후 관리자 계정만 사용하시려면 시작 -> 검색창에다가 netplwiz 입력,실행 -> Administrator 선택, "사용자 이름과 암호를 입력해야 이 컴퓨터를 사용할 수 있음"에 체크해제 (이 옵션은 로그온 화면에서 비밀번호를 입력하지 않고 자동으로 로그인 하게 해주는 옵션, 위 그림의 두번째 화살표에 자동 로그온할 사용자를 선택해주면 됨)


 

마우스 문맥 메뉴에 관리자 권한으로 명령 프롬프트 폴더에 열기 명령 추가

 


 

 스누피님이 만드신 레지스트리 파일을 추가하면 자동으로 마우스 문맥 메뉴에 "관리자 권한으로 명령 프롬프트 열기" 항목이 추가됩니다. 



탐색기 아이콘 클릭시 열리는 원한는 경로 지정하기

 


▲ 탐색기 아이콘에 마우스를 대고 Shift + 마우스 오른쪽 버튼 -> 속성 버튼을 클릭합니다 (이때 탐색기가 실행되어 있으면 속성 문맥이 나오지 않습니다, 꼭 닫아주세요)



▲ 대상 부분에다가 아래와 같이 원하는 경로를 입력합니다.


원하는 경로를 지정시엔  %windir%\explorer.exe /e,E:\Windows 한칸을 띠우고 /e,원하는 폴더명을 적어 주시면 됩니다.

D 드라이버 : %windir%\explorer.exe /e,E:\Windows /e,D:\

C 드라이버 : %windir%\explorer.exe /e,E:\Windows /e,C:\

내 컴퓨터 : %windir%\explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}


 

탐색기에 라이브러리 항목 제거

 

 

▲ 탐색기를 열면 왼쪽 편에 라이브러리 항목이 자동으로 표시되죠, 이 항목을 사용하지 않는 분들은 상당히 거슬립니다. 레지스트리 파일을 통해 깔끔하게 제거/추가가 가능합니다. (로그오프 혹은 재부팅시 적용)



자기도 모르게 CPU 사용률이 높을 때

 

 

 


 

▲ 윈도우 7 사용중 자기도 모르게 CPU 사용률이 높은데 네트워크 설정을 바꿔주면 문제가 해결됩니다. "네트워크 및 공유 센터" 에서 원하는 네트워크 선택



▲ "이후에 연결하는 모든 네트워크를 공용으로 처리합니다......" 항목에 체크, 공용 네트워크를 클릭합니다.


 

탐색기 폴더 확장

 

 


 

▲ 윈도우7을 설치하면 탐색기 왼쪽편에 있는 폴더들이 자동으로 폴더 펼침이 되어있지 않습니다. 


위 그림 처럼 폴더 확장을 하려면 메뉴 모음쪽에 구성 -> 폴더 및 검색 옵션 -> "탐색 창 탭에 자동으로 현재 폴더 확장" 버튼에 체크하여 주시면 되겠습니다. 그위에 "모든 폴더 표시"에 체크하시면 탐색기 왼쪽편에 휴지통, 네트워크 등등의 항목이 보여지게 됩니다.



 

 

시스템 종료 속도 빠르게 하기

 


날씨 가젯 등 추가

 


 

▲ 윈도우 7을 설치하면 날씨 가젯이 "이 지역에선 사용할 수 없습니다" 라고 나오는데요, 가젯 홈페이지에서 업데이트된 녀석을 설치해주면 문제없이 설치됩니다. 아래는 추천하는 가젯들 입니다.


※ 다운로드 후 확장자를 *.gadget 이런 식으로 다시 gadget로 바꿔주셔야 합니다.

향상된 달력, 일정 가젯

날씨 가젯 (업데이트 버전)

바탕화면에 종료, 재부팅, 로그오프 버튼의 가젯



▲ 그 외에 가젯 홈페이지에서 필터 기준을 모든 언어, 혹은 영어로 바꿔주시면 더욱 다양한 가젯들을 만나보실 수 있습니다 ^^


 

필요없는 서비스 항목 끄기

 

윈도우7 설치후 기본적으로 시작되는 서비스는 일반 사용자들에게 필요없는 항목이 많습니다. 또한 이러한 것들이 쓸데없이 리소스를 많이 잡아먹기도 하구요. 서비스 항목을 트윅하여 주면 어느정도 성능향상을 볼 수 있습니다. 



윈도우7의 유용한 단축키

 

윈도우키 + "-"혹은"+" : 돋보기 기능(확대)

바탕화면에서 Ctrl + 마우스 스크롤 : 바탕화면 아이콘 크기 변경


기타 더 많은 단축키들 -> 링크



작업표시줄에 빠른실행 추가

 


▲ 작업 표시줄에서 마우스 오른쪽 클릭 -> 도구 모음 -> Quick Launch


 


▲ %userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch 입력



 

▲ 마우스 오른쪽 클릭 -> 작업 표시줄 잠금 체크해제 텍스트 표시, 제목표시 역시 체크해제 한 다음 원하는 위치로 옮겨준 뒤 다시 작업 표시줄 잠금을 해주게되면 XP와 비슷한 형식의 퀵런치가 완성!


 

 

IE8, 빠르게 하는 레지스트리 파일

 


작업표시줄의 탐색기에 자주 사용하는 폴더 추가(고정)하기

 

 


▲ 작업표시줄에 나오는 탐색기 항목을 오른쪽 클릭하면 최근항목이 나오는데요, 여기에 자주 사용하는 폴더를 고정 메뉴에 추가하여 더욱 편하게 원하는 폴더에 접근할 수 있습니다. 



 

▲ 원하는 폴더를 고정시키는 방법은 아주 간단한데요, 탐색기 실행후 원하는 폴더를 작업표시줄에 탐색기 항목으로 드래그해주면 자동으로 고정됩니다.


 

탐색기에 체크박스 추가하여 폴더/파일 다중 선택하기

 

 

 

 


▲ 저는 보통 Ctrl + 마우스 왼쪽 버튼을 클릭하여 다중 선택을 하지만, 윈도우7에 이와 관련되서 괜찮은 기능이 있네요, 폴더/파일의 왼쪽 상단에 작은 체크박스를 추가하여 다중선택이 가능하게 해주는 기능입니다.



 

▲ 방법은 탐색기 실행 후 왼쪽 상단에 구성 -> 폴더 및 검색 옵션 -> 보기 탭에서 확인란을 사용하여 항목 선택에 체크하여 주시면 됩니다.


 

스티커 메모 활용하기

 

 


 

저는 윈도우7에 내장되어 있는 스티커 메모를 자주 활용하는데요, 보통 작업표시줄에 빠른 항목을 고정 시킨뒤 사용합니다. 윈도우7의 스티커 메모는 단축키를 이용하여 굵기,기울기,밑줄 등의 간단한 조정이 가능합니다. 위에 그림을 참조하세요.


 

윈도우7 USB 설치하기

 

 

1. 시작 -> 명령 프롬프트 관리자 권한으로 실행(마우스 오른쪽 버튼으로 선택하거나 Ctrl+Shift+Enter 입력)

2. diskpart 입력

3. list disk 입력

4. select disk 번호(usb메모리 선택)

5. clean 명령으로 usb 내용 지우기(usb에 중요한 파일이 있을경우 미리 백업!)

6. creat partition primary 명령으로 파티션 생성

7. list partition 파티션 목록 보기

8. select partition 1 명령으로 만들어진 파티션 선택

9. active 입력

10. format fs=ntfs quick 명령으로 NTFS로 빠른 포멧

11. 윈도우7 설치 디스크 usb로 복사

12. 부팅시 CMOS 설정으로 들어가 부팅메뉴를 USB-HDD로 선택



작업표시줄 섬네일 미리보기 속도 조정하기

 


Windows 7은 작업표시줄의 프로그램 아이콘위에 마우스 포인터를 가져가면 열린창의 미리보기가 썸네일로 표시됩니다. 기본적으로, 마우스를 올린다음 미리보기가 나타나기까지 약간의 시간이 걸립니다. 이게 답답하게 느껴질 경우 아래의 레지스트리 트윅을 사용하면 좀 더 빠른 속도로 나타나게 할 수 있습니다.


1. 시작 -> 실행(혹은 윈도우키 + R) -> regedit 입력

2. HKEY_CURRENT_USER\Control Panel\Mouse 로 찾아간 다음 오른쪽편에 있는 값들중 MouseHoverTime 의 키값을 기본값인 400 에서 150으로 낮추면 미리보기가 좀 더 빨리 표시되게 됩니다.


150보다 더 낮출경우 문제가 발생할수도 있기 때문에 주의하셔야 합니다.


 

 

하위메뉴 팝업(표시)시간 줄이기

 

 

 


위 17번 팁과 비슷한 내용입니다.

윈도우 시작에 하위메뉴가 표시하는 기본적인 시간이 약간 느리게 설정되어있는데, 레지스트리 설정으로 표시 시간을 빠르게 할 수 있습니다. 컴퓨터 사양이 좋거나, 하위메뉴가 느리게 뜨는 것이 답답한 분들은 설정해보세요.


1. 시작 -> 실행(혹은 윈도우키 + R) -> regedit 입력

2. HKEY_CURRENT_USER\Control Panel\Desktop 로 이동

3. MenuShowDelay 항목을 0~100 사이에 적당한 값으로 바꾸어줍니다. 전 0으로 하여도 별다른 이상은 없었습니다.


 

 

윈도우7 하드에서(CD, USB없이) 설치하기

 

Vista 운영체제인 경우


1. 윈도우7 원본 시디안에 있는 Boot, Sources 2개의 폴더를 D드라이브(윈도우가 설치된 시스템 파티션 드라이브 외의 드라이브)등의 하드디스크에 복사하여 줍니다. 

2. 아래 cmd파일을 관리자 권한으로 실행합니다.



3. 재부팅 하시면 아래 그림과 같은 부팅 관리자 메뉴가 자동으로 뜨게됩니다. 2번째 윈도우 7 or 비스타 설치하기 [EMS 사용 가능] 메뉴를 클릭하시고 윈도우 7 설치 할 때와 똑같이 진행하시면 됩니다.



XP 운영체제인 경우


1. 윈도우7 원본 시디안에 있는 Boot, Sources, Bootmgr 3개의 폴더를 D드라이브(윈도우가 설치된 시스템 파티션 드라이브 외의 드라이브)등의 하드디스크에 복사하여 줍니다. 

2. Bootmgr 파일의 이름을 snoopy로 변경합니다.

3. 아래 exe 파일을 실행합니다.



4. 재부팅 하신 뒤 부팅 메뉴에서 윈도우 7 설치 시작하기 항목을 선택하시고 정상적으로 윈도우 7 설치를 진행하시면 됩니다.


자료 출처 : Snoopybox


 

 

윈도우7 Administrator 사용자 계정으로 설치하기

 

윈도우를 처음 설치하면 Administrator 계정 이외에 설치시 입력한 개별 사용자의 이름이 새로 생기는데요, 이 계정에 명령 프롬프트에서 어드민 계정을 활성화 시켜주는 등의 귀찮은 작업을 하기 싫으신 분들은 윈도우 설치시 바로 관리자(Administrator)으로 설치할 수 있습니다. 


윈도우 설치 과정의 제일 마지막 단계인 사용자 계정 생성 단계에서 사용자 이름 입력을 하는 창이 뜨는데요, 여기서 Shift + F10버튼을 누르면 명령 프롬프트 창이 뜨게 됩니다. 그후 위 팁 1번에서 설명드렸던 net user administrator /active:yes을 입력하여 관리자 계정으로 로그인합니다. 그런 후 명령을 잘 실행했습니다 라는 말이 나오면 다시 taskmgr을 입력하여 작업 관리자 창을 띄웁니다. 응용 프로그램에 작업 목록을 보시면 msoobe라는 프로세서가 실행중인데 아래쪽에 작업 끝내기(X)버튼을 눌러주시면 끝..


 


관리자 계정으로 설치하게 되면 사용자 이름이 무조건 Administrator으로 나오게 되는데요, 사용자 이름이 마음에 들지 않으시다면 내 컴퓨터 오른쪽 클릭 - 관리 - 로컬 사용자 및 그룹 - 사용자에서 Administrator의 이름을 원하는 이름으로 변경해 주시면 되겠습니다.



 

이상으로 간략하게 나마 윈도우7 팁에 대해 알아보았습니다, 아직 저도 모르는 부분이 많아 열심히 배우고 있는 중이에요~ 앞으로 추가사항이 있으면 꾸준히 업데이트하겠습니다. (Update :: 2009.12.23)

메모장에서 오른쪽 마우스 클릭 - 오른쪽에서 왼쪽으로 읽기(R) 체크 해제

출처 - http://gogorchg.tistory.com/entry/%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8

 

 

#define SIGHUP   1
#define SIGINT   2
#define SIGQUIT   3
#define SIGILL   4
#define SIGTRAP   5
#define SIGABRT   6
#define SIGIOT   6
#define SIGBUS   7
#define SIGFPE   8
#define SIGKILL   9
#define SIGUSR1  10
#define SIGSEGV  11
#define SIGUSR2  12
#define SIGPIPE  13
#define SIGALRM  14
#define SIGTERM  15
#define SIGSTKFLT 16
#define SIGCHLD  17
#define SIGCONT  18
#define SIGSTOP  19
#define SIGTSTP  20
#define SIGTTIN  21
#define SIGTTOU  22
#define SIGURG  23
#define SIGXCPU  24
#define SIGXFSZ  25
#define SIGVTALRM 26
#define SIGPROF  27
#define SIGWINCH 28
#define SIGIO  29
#define SIGPOLL  SIGIO
/*
#define SIGLOST  29
*/
#define SIGPWR  30
#define SIGSYS  31
#define SIGUNUSED 31

/* These should not be considered constants from userland.  */
#define SIGRTMIN 32
#define SIGRTMAX _NSIG

 

* 주요 시그널 종류

 

SIGABRT : abort함수를 호출하면 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGALRM: alarm 함수를 호출하면 보내지며, 이 시그널을 받으면 종료한다.

 

SIGBUS: 하드웨어 결함이 탐지되면 보내지며, 이 시그널을 받으면 종료한다.

 

SIGCHLD : 자식 프로세스가 종료되면 부모 프로세스에 보내지며 ,wait에서 이 시그널에 의해 깨어난다.

 

SIGCONT:중단되어 있는 프로세스가 이 시그널을 받으면 실행을 하고 실행중인 프로세스가 받으면 무시한다.

 

SIGFPE:0으로 나누기,부동소수점 오류등이 발생했을때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료

 

SIGHUP:터미널 연결이 끊어 졌을때 이 터미널과 연결된 세션 리더 또는 세션에 속한 모든 프로세스들에게 보내지며, 이시그널을 받으면 종료한다.

 

SIGILL:불법 명령어를 실행할때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGINT:터미널에서 인터럽트 키(일반적으로 <CTRL+C>)를 눌렀을때 보내지며, 이 시그널을 받을시 종료

 

SIGKILL:프로세스를 종료 시키기 위해 보내지며,이 시그널을 받으면 반드시 종료한다.

 

SIGPIPE:터미널에서 종료키(일반적으로<CTRL+\>)를 눌렀을때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료

 

SIGSEGV:잘못된 메모리 주소를 접근하고자 할때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGSTOP:프로세스를 멈추기 위해 보내지며, 이 시그널을 받으면 반드시 멈춘다.

 

SIGSYS:잘못된 시스템 호출을 했을 때 보내지며, 이 시그널을 받으면 코어 덤프하고 종료한다.

 

SIGTERM:프로세스를 종료시키기 전에 하던 일을 정리하고 종료할 것을 알릴때 보내진다.

 

SIGTSTP:터미널에서 일시 중지 키(일반적으로(CTRL+Z))를 눌렀을때 보내지며, 이 시그널을 받을시 멈춤

 

SIGTTIN:백그라운드 작업중인 프로세스가 표준 입력을 하려 할때 현재 실행중인 프로세스에 보내지며 이시그널을 받으면 멈춘다.

 

SIGTTOU:백그라운드 작업중인 프로세스가 표준 출력을 하려 할때 현재 실행중인 프로세스에 보내지며, 이 시그널을 받으면 멈춘다.

 

SIGQUIT : 대화형 종료 : 코어 덤프 ( 보통 Ctrl + I)

 

SIGURS1&SIGURS2:사용자가 정의해서 사용할 수 있는 시그널로, 이 시그널을 받으면 종료한다.

 

 

* 시그널을 사용하는데 자주 쓰이는 함수들 : 시그널 마스크와 시그널 세트 다루기

 

int sigemptyset(sigset_t *set) //빈 시그널 집합을 생성

 

int sigfillset(sigset_t *set)//모든 시그널을 포함한 집합을 생성

 

int sigaddset(sigset_t,*set,int signum)//시그널 집합에 추가

 

int sigdelset(sigset_t,*set,int signum)//시그널 집합에서 삭제

 

int sigismember(const sigset_t *set, int signum)//시그널 집합에 signum이 속하는지 확인

 

set: 시그널 집합

 

signum: 시그널 번호

 

 

시그널 처리....

 

void (*signal(int signum,void(*sighandler)(int)))(int)//시그널 처리를 설정한다.

signum:시그널 번호

sighandler:설정할 시그널 핸들러

 

****시그널 핸들러의 종류 3가지*****

함수 이름 : 시그널을 받으면 "함수 이름" 함수가 실행됨.

SIG_IGN  : 시그널을 받으면 무시한다.

SIG_DFL : 시그널을 받으면 시스템에서 기본적으로 설정한 동작을 한다.

**********************************

조금 업글된 기능의 시그널 처리 함수로..

 

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact)//시그널 처리를 설정

signum:시그널 번호

act : 설정할 행동

oldact:이전 행동

********act의 구조체 분석************

struct sigaction{

void(*sa_handler)(int)//설정할 시그널 핸들러

void (*sa_sigaction)(int,siginfo_t *,void *)//sa_handler 대신 사용될 시그널 핸들러

sigset_t sa_mask;//시그널을 처리하는 동안 블록화할 시그널 집합

int sa_flags;// 시그널 처리 관련 옵션들

void(*sa_restorer)(void);//사용되지 않음

}

 

 

시그널 보내기......

int kill(pid_t pid, int sig)//프로세스에 시그널을 보낸다.

int pause(void)//시그널이 도착할 때까지 실행을 중단시킨다.

int raise(int slg)//자기 자신에게 시그널을 보낸다.

unsigned int alarm(unsigned int seconds)//자신에게 SIGALRM시그널을 보낸다

pid:시그널을 받을 프로세스의 프로세스 ID

sig:보내고자 하는 시그널 번호

seconds: 시그널을 보낼 시간, 초

 

****pid값****

양의정수: 프로세스 ID가 pid인 프로세스에 시그널을 보낸다.

0: kill을 호출한 프로세스가 속한 프로세스 그룹의 모든 프로세스에 시그널을 보낸다

-1:1번 프로세스를 제외한 모든 프로세스에 큰 번호에서 작은 번호의 프로세스 순으로 시그널을 보낸다

-1미만:pid절대값프로세스 그룹의 모든 프로세스에 시그널을 보낸다.

 

 

시그널 블록.....

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)//블록화될 시그널을 설정한다.

int sigpending(sigset_t *set)//블록화된 시그널을 얻어온다.

int sigsuspend(const sigset_t *mask)//시그널 블록을 설정함과 동시에 시그널이 도착할때까지 중단

how:취할 동작

mask:블록화될 시그널 집합

set: 설정할 시그널 집합

oldset: 이전에 블록화된 시그널 집합

 

****how 값******

SIG_BLOCK : 기존에 블록화된 시그널 집합에 set의 시그널이 추가된다.

SIG_UNBLOCK: 기존에 블록화된 시그널 집합에서 set의 시그널이 제외된다.

SIG_SETMASK:set의 시그널이 블록화된 시그널 집합으로 교체된다.

출처 - http://itguru.tistory.com/66 

 

sprintf

#include <stdio.h> // C++ 에서는 <cstdio>

int sprintf ( char * str, const char * format, ... );



str 에 데이터를 형식에 맞추어 쓴다.
str 가 가리키는 배열에 형식 문자열에 지정한 방식 대로 C 문자열을 쓴다. 쉽게 설명하자면, printf 에서 화면에 출력하는 대신에 화면에 출력할 문자열을 인자로 지정한 문자열에 쓴다는 것이다. 이 때, 인자로 지정한 배열의 크기는 배열에 쓰여질 문자열의 크기 보다 커야만 한다. 주의할 점은 sprintf 함수는 자동적으로 str 맨 마지막에 NULL  문자를 붙이기 때문에 항상 한 칸의 여유가 있어야 한다.

   인자
 

str

C 문자열이 저장될 char 배열을 가리키는 포인터

 
format

위 str 에 쓰여질 문자열을 포함하는 형식 문자열으로, 이는 형식 태그를 포함할 수 있다. 이 때, 형식 태그는 부수적 인자로 지정한 데이터와 치환되어 쓰여지게 된다. 이 때, 데이터가 치환되는 방식은 형식 태그에 의해 좌우된다. 따라서 부수적 인자의 개수는 적어도 형식 문자열에 사용된 형식 태그의 수 보다 많아야 한다.

  • 형식 태그는 아래와 같이 생겼다.

  • %[플래그(flag)][폭(width)][.정밀도][크기(length)]서식 문자(specifier)

  • 이 때 서식 문자(specifier) 는 대응하는 인자를 어떠한 형태로 표현할지를 결정하는데에 가장 중요한 역할을 한다.

  • 서식문자 출력 형태

    c 문자
    a
    d or i 부호 있는 십진법으로 나타난 정수 392
    e 지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다.
    3.9265e+2
    E 지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다. 3.9265E+2
    f 십진법으로 나타낸 부동 소수점 수
    392.65
    g %e 나 %f 보다 간략하게 출력 392.65
    G %E 나 %f 보다 간략하게 출력 392.65
    o 부호 있는 팔진수
    610
    s 문자열
    sample
    u 부호없는 십진법으로 나타낸 정수
    7235
    x 부호없는 16 진법으로 나타낸 정수 (소문자 사용)
    7fa
    X 부호없는 16 진법으로 나타낸 정수 (대문자 사용)
    7FA
    p 포인터 주소
    B800:0000
    n 아무것도 출력하지 않는다. 그 대신, 인자로 부호 있는 int 형을 가리키는 포인터를 전달해야 되는데, 여기에 현재까지 쓰여진 문자 수가 저장된다.
    % % 다음에 %를 또 붙이면 stdout 에 % 를 출력한다.

  • 위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다.

  • #include <stdio.h>
    int main()
    {
        int integer = 123;
        char character = 'c';
        char string[] = "hello, world";
        int* pointer = &integer;
        double pi = 3.141592;
        char buf[100];
        

        sprintf(buf, "integer : (decimal) %d (octal) %o \n", integer, integer);
        printf("%s \n", buf);

        sprintf(buf,"character : %c \n", character);
        printf("%s \n", buf);

        sprintf(buf,"string : %s \n", string);
        printf("%s \n", buf);

        sprintf(buf,"pointer addr : %p \n", pointer);
        printf("%s \n", buf);

        sprintf(buf,"floating point : %e // %f \n", pi, pi);
        printf("%s \n", buf);

        sprintf(buf,"percent symbol : %% \n");
        printf("%s \n", buf);

        return 0;

  • 출력 결과

  • 출처 - http://forum.falinux.com/zbxe/?document_srl=408126&mid=C_LIB&sort_index=readed_count&order_type=desc

     

    설명

    문자열을 문자로 자르는 함수 입니다. 예로, "forum.falinux.com"을 "."으로 자르기를 하면 함수를 호출할 때 마다 "forum", "falinux", "com"의 선두 번지의 포인터를 반환합니다.

    처음에는 자르기 대상인 문자열과 자르기를 위한 문자를 인수로 호출합니다.

    strtok( str, sep);

    이후에는 문자열 대상을 NULL과 자르기를 위한 문자만 인수로 전달합니다.

    strtok( NULL, sep);

    더 이상 구할 문자열이 없다면 NULL이 반환됩니다.

    *** 주의 ***

    strtok()는 잘라 낸 문자열을 구하기 위해 대상 문자열에 NULL을 추가합니다. 즉, 원래의 문자열 내용이 변경 되므로 주의해야 합니다.

    헤더 string.h
    형태 char *strtok(char *restrict s1, const char *restrict s2);
    인수
    char *s1 자르기 대상 문자열
    char *s2 잘라 내기 위한 문자 모임
    반환
    char * 잘라 내기한 문자열의 첫번째 포인터를 반환하며, 문자열이 없다면 NULL을 반환

    예제

    #include <stdio.h>
    #include <string.h>
    
    int main( void)
    {           
       char   str[] = "forum falinux com";
       char	*ptr;
       int	 ndx;
    
       printf( "함수 호출 전: %s\n", str); 
    
       ptr = strtok( str, " ");
       printf( "%s\n", ptr); 
       
       while( ptr = strtok( NULL, " "))
       {
    	   printf( "%s\n", ptr); 
       }
       
       printf( "함수 호출 후: %s\n", str); 
    
       // 함수 호출 후에는 원본 문자열의 내용이 바뀌므로 주의해야 합니다.
            
       printf( "문자열의 변화\n", str); 
      
       for( ndx=0; ndx < 17; ndx++)
    	   printf( "%c %d\n", str[ndx], str[ndx]); 
    	   
       return 0;
    }
    

     

    출처 - http://mintnlatte.tistory.com/444

     

    (1) Declation
    : atoi() : 문자열을 정수로 변환한다.


     int atoi(const char *str)
     
    - str : 변환하기 위한 정수 문자열


    (2) Return Value

    - Succ = 변환에 성공한 정수 값 반환
    - Fail = 0 반환


    (3) Descriptions
    : atoi() 함수는 문자열을 정수로 변환하는 함수이다.

    - 정수로 된 문자열을 전달하여 int 형 정수로 변환한다.
    - 전달된 문자열에 정수가 아닌 문자가 포함될 경우 문자 이전까지만 변환하고 값을 반환한다.
    - 정수가 존재하지 않는 문자열을 전달할 경우 실패하여 0을 반환한다.
    - 음수의 경우 '-'를 음수 부호로 해석해서 정상적인 반환처리가 이루어 진다.
    - 문자열의 앞에 나오는 공백은 탭이나 개행 문자까지 포함해서 모두 무시된다.
    - 부호는 '+'나 '-' 기호 중에서 한 번만 나올 수 있고, 중복되어 나오면 두 번째 기호에서 변환에 실패한다.
    - 공백이나 부호가 "숫자" 중간에 올 경우 공백이나 부호 이전까지만 변환하고 값을 반환한다.
    - int 자료형을 사용하기 때문에, 오버플로우가 발생할 수 있다는 사실을 염두해야한다.
     

    (4) Example

     

    - Source

     

     

     

    - result

     

    출처 - http://forum.falinux.com/zbxe/index.php?document_srl=408173&mid=C_LIB

     

     

    설명

    2개의 메모리 변수에 대해 내용을 비교하여 첫 번째 인수보다 두 번째 인수가 같은지, 큰지, 작은지를 구합니다.

    헤더 string.h
    형태 int memcmp(const void *s1, const void *s2, size_t n);
    인수 void *s1 비교 대상 메모리 포인터
    void *s2 비교할 메모리 포인터
    size_t n 비교할 바이트 크기
    반환 int
    • 양의 정수 : s1 이 s2보다 크다.
    • 0 : s1과 s2가 같다.
    • 음의 정수 : s1보다 s2가 크다.
    예제
    #include <stdio.h>
    #include <string.h>
    
    int main( void)
    {
       char   *ptr1 = "forum";
       char   *ptr2 = "forum";
       char   *ptr3 = "forum.falinux";
       char   *ptr4 = "falinux";
       char   *ptr5 = "com";
    
    
       printf( "%s with %s = %dn", ptr1, ptr2, memcmp( ptr1, ptr2, strlen(ptr1)));
       printf( "%s with %s (ptr1 size)= %dn", ptr1, ptr3, memcmp( ptr1, ptr3, strlen(ptr1)));
       printf( "%s with %s (ptr3 size)= %dn", ptr1, ptr3, memcmp( ptr1, ptr3, strlen(ptr3)));
       printf( "%s with %s = %dn", ptr1, ptr4, memcmp( ptr1, ptr4, strlen(ptr1)));
       printf( "%s with %s (ptr1 size)= %dn", ptr1, ptr5, memcmp( ptr1, ptr5, strlen(ptr1)));
       printf( "%s with %s (ptr5 size)= %dn", ptr1, ptr5, memcmp( ptr1, ptr5, strlen(ptr5)));
    
       return 0;
    }
    

    + Recent posts