'OS/리눅스 & 유닉스'에 해당되는 글 130건

  1. 2012.02.11 shell 조건문
  2. 2012.02.11 shell 조건 연산자
  3. 2012.02.11 chmod suid
  4. 2012.02.11 egrep 정규식
  5. 2012.02.10 The GNU C Library Reference Manual
  6. 2012.02.09 vmstat
  7. 2012.02.09 SAR(System Activity Reporter)
  8. 2012.02.04 gettimeofday
  9. 2012.02.02 쓰레드, 시그널2
  10. 2012.02.02 쓰레드, 시그널

shell 조건문

OS/리눅스 & 유닉스 2012. 2. 11. 16:51

1) 단일 조건문


# Case 1

if [ -z $ans ]

then

echo "blank"

fi

# Case 2
if [ -z $ans ] || [ $ans = "N" ]
then
echo "No"
fi

# Case 3
if [ -z $ans ] || ([ $ans != "Y" ] && [ $ans != "y" ])
then
echo "No"
fi

2) if ~ else

if [ 조건문 ]
then
명령어...
else
명령어...
fi

3) if ~ elif ~ else


if [ 조건문 ]

then


elif [ 조건문 ]

then


else


fi

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

grep 명령어  (0) 2012.02.13
grep, egrep, fgrep & 정규식  (0) 2012.02.13
shell 조건 연산자  (0) 2012.02.11
chmod suid  (0) 2012.02.11
egrep 정규식  (0) 2012.02.11
:

shell 조건 연산자

OS/리눅스 & 유닉스 2012. 2. 11. 16:35

(2) 테스트 연산자

 

[ ](대괄호) 안의 조건식에는 여러 종류의 테스트 연산자를 사용할 수 있으며, 연산자의 종류 및 기능은 다음과 같습니다..

* 다음 조건을 충족시킬 경우, true 리턴

-e : 존재하는 파일
-f : 보통 파일
-d : 파일이 디렉토리
-s : 파일 크기가 0이 아님
-z : 문자열이 null임. 길이가 0
-n : 문자열이 null이 아님
-c : 파일이 문자 디바이스(키보드, 모뎀, 사운드 카드..)
-b : 파일이 블럭 디바이스(플로피나 CD롬)
-p : 파일이 파이프
-h : 파일이 하드 링크
-L : 파일이 심볼릭 링크
-S : 파일이 소켓
-t : 파일 디스크립터가 터미널 디바이스와 연관 있음
-r : 테스트를 돌리는 사용자가 읽기 퍼미션을 갖고 있음
-w : 테스트를 돌리는 사용자가 쓰기 퍼미션을 갖고 있음
-x : 테스트를 돌리는 사용자가 실행 퍼미션을 갖고 있음
-g : 파일이나 디렉토리에 set-group-id 플래그가 세팅되어 있음

가령 예를 들자면,

if [ -d /tmp ]; then

    echo '/tmp 디렉토리가 존재합니다.'

else

    echo '/tmp 디렉토리가 존재하지 않습니다.'

fi

위와 같이 사용하면 됩니다..

 

파일과 관련한 연산자일 경우는 연산자 뒤에 파일명이, 디렉토리와 관련한 연산자일 경우는 연산자 뒤에 디렉토리명이 명시되어야 합니다..

 

다음은 산술 비교 연산자 및 문자열 비교 연산자입니다..

 

산술 비교 연산자

문자열 비교 연산자

-eq (equal)

== 

-ne (not equal)

!=

-gt (greater than)

 

-ge (greater than or equal)

 

-lt (less than)

 

-le (less than or equal)

 

 

산술 비교 연산자는 수치 비교를 위해 사용되며, 다음과 같이 사용됩니다..

if [ ${input} -eq 0 ]; then

    echo 'input 값은 0과 같습니다.'

else

    echo 'input 값은 0과 같지 않습니다.'

fi

문자열 비교 연산자는 수치 비교를 위해 사용되며, 다음과 같이 사용됩니다..

if [ ${input} == "test" ]; then

    echo 'input 값은 test 문자열과 같습니다.'

else

    echo 'input 값은 test 문자열과 같지 않습니다.'

fi

'$(달러)' 문자로 시작되는 값은 변수를 의미합니다..

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

(3) 논리 연산자

 

[ ](대괄호) 안의 조건식에 두 개 이상의 조건을 넣어야 할 경우 논리 연산자를 사용할 수 있으며, 연산자의 종류 및 기능은 다음과 같습니다..

-a : and, &&

-o : or, ||

논리 연산자의 사용법은 다음과 같습니다..

if [ 조건식1 -a 조건식2 ]; then

    ~

else

    ~

fi

다들 알고 계시겠지만, and 논리 연산자의 경우 '조건식1' 이 true 이어야지만 '조건식2' 로 넘어가며, '조건식1' 이 false인 경우 '조건식2' 의 체크없이 바로 else 구문으로 넘어가게 됩니다..

 

사용 예를 들자면, 다음과 같습니다..

if [ -f ${file1} -a -f ${file2} ]; then

    echo 'file1과 file2는 모두 파일입니다.'

else

    echo 'file1과 file2가 모두 파일인 것은 아닙니다.'

fi

이상은 논리 연산자에 대한 사용법에 대해서 설명 드렸고, 다음은 자주 사용되는 연산자는 아니지만 추가로 덧붙입니다..

 

(4) 파일 생성 시기 비교 연산자

 

[ ](대괄호) 안의 조건식에 두 개의 파일 중 어떤 것이 더 먼저, 혹은 나중에 생성되었는지 알고자 할 경우 다음과 같은 비교 연산자를 사용할 수 있습니다..

f1 -nt f2 : f1파일이 f2파일보다 최신임(newer than)
f1 -ot f2 : f1파일이 f2파일보다 예전것임(older than)

위 연산자에 대한 예시는 따로 들지 않겠습니다..

 

이상으로 if문에서 자주 사용되는 연산자들과 사용법에 대해서 알아보았구요..

 

예제 스크립트로 바로 넘어갈까 했는데 한 가지 더 설명드리고 예제 스크립트를 보여 드리는 편이 나을 것 같아서 잠깐 언급하도록 하겠습니다..

 

* Shell Script 에서 input 값 받아 처리하기

 

우리가 Shell Script를 작성하다 보면 외부로부터 받은 input 값을 스크립트 내부에서 처리해야 하는 경우가 종종 발생하게 됩니다..

 

가령, ./test.sh [input_parameter1] [input_parameter2] 와 같은 식으로 말이죠..

 

위와 같이 외부로부터 받은 input 값은『 위치 매개변수 』를 통하여 처리하면 됩니다..

$1, $2, $3, ... : input_parameter1은 $1 위치 매개변수로, input_parameter2는 $2 위치 매개변수로 처리

※ $0 : 해당 Shell Script의 이름

예를 들어, 스크립트로 넘어온 input 값이 0인지 아닌지 비교하는 스크립트(ex. number_compare.sh)를 작성하고 싶다 하면 다음과 같이 하면 됩니다..

#!/bin/sh

if [ $1 -eq 0 ]; then

    echo 'input 값은 0 입니다.'

else

    echo 'input 값은 0 이 아닙니다.'

fi

위와 같이 작성하고 다음과 같이 실행시키면 됩니다..

 ./number_compare.sh [숫자]

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

grep, egrep, fgrep & 정규식  (0) 2012.02.13
shell 조건문  (0) 2012.02.11
chmod suid  (0) 2012.02.11
egrep 정규식  (0) 2012.02.11
The GNU C Library Reference Manual  (0) 2012.02.10
:

chmod suid

OS/리눅스 & 유닉스 2012. 2. 11. 15:29

질문하신 s 는 SUID 를 뜻합니다.

 

SUID(Set User ID) 에 대해 설명을 드릴께요.

아래에 실제로 어떻게 사용이 되는지 테스트 해 볼 수 있도록

실습예제도 첨부합니다.

 

'chmod 4544 파일명' 에서

초록색으로 표시한 첫번째 부분은 아래 3가지의 조합을 나타냅니다.

  • 4 : set user ID  
  • 2 : set group ID
  • 1 : sticky attributes.

set user id 는 해당 파일의 소유자(user)로 셋팅을 한다는 말입니다.

 

참고로,

-r--r--r-x 에 set user ID 와 set group ID를 설정하면,

-r-Sr-Sr-x 가 됩니다. (S가 대문자)

 

-r-xr-xr-x 일 경우에 set user ID 와 set group ID를 설정하면,

-r-sr-sr-x 가 됩니다. (s가 소문자)

--------------------------------------

 

< set user id 사용 예 >

 

1. /bin/ping 권한 확인

자주 사용하는 ping 의 소유자(user)와 퍼미션(permission)을 확인해 보겠습니다.

ls -l /bin/ping 해보면 아래와 같습니다.

 

-r-sr-sr-x    1 root     root        28628  1월 25  2003 /bin/ping

permission은 6555 입니다.

root     root        에서 왼쪽이 소유자(user) 이고 오른쪽이 그룹(group)입니다.

-r-xr-xr-x 에 set user ID 와 set group ID가 설정된 것입니다.

-r-xr-xr-x 는 555 이고

set user ID 는 4 ,

set group ID 는 2 이므로

 

(4+2)555 => 6555

 

그러므로,

/bin/ping 은 set user ID, set group ID 가 설정되어 있고

파일 소유권은 root 에게 있다는 것을 알 수 있습니다.

 

 

2. SID, GID 제거 후 테스트

set user ID 와 set group ID를 제거한 후 테스트를 해 보겠습니다.

chmod 555 /bin/ping  (root 관리자로)

(set user ID 와 set group ID가 없어집니다.)

 

이제 root 유저가 아닌 일반 계정은 ping 명령을 사용하지 못합니다.

 

[user01@localhost ]$ ping daum.net
ping: icmp open socket: Operation not permitted


 

다시 말해, set user ID , set group ID  설정 유무에 따라

일반 사용자가 ping을 사용가능 여부가 결정된다는 겁니다.

 

원래대로 복구하기 위해

chmod 6555 /bin/ping (root 관리자로)

이제 일반 사용자도 ping을 사용할 수 있습니다.

 

결론

ping 프로그램은 root 권한으로 실행되어야 작동이 되는 프로그램입니다.

프로그램을 일반사용자가 실행을 하면 일반사용자의 권한으로 실행이 됩니다.

일반 사용자가 아닌 root 권한으로 실행되게 하기 위해서는

set user ID 와 set group ID를 설정해야 합니다.

이런 용도로 사용되는 것이 SUID입니다.

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

shell 조건문  (0) 2012.02.11
shell 조건 연산자  (0) 2012.02.11
egrep 정규식  (0) 2012.02.11
The GNU C Library Reference Manual  (0) 2012.02.10
vmstat  (0) 2012.02.09
:

egrep 정규식

OS/리눅스 & 유닉스 2012. 2. 11. 13:54
grep은 한번에 한가지 패턴밖에 못 먹는다.
이걸 해결해서 grep에 정규식을 사용할 수 있는 것이 egrep


예를 들어 네트워크 상태 중 ESTABLISHED 와 LISTEN 의 리스트를 보고 싶을 때,
grep 을 사용할 경우 아래처럼 명령어를 두 번 넣어야 한다.

netstat -ant | grep ESTABLISHED ; netstat -ant | grep LISTEN

하지만 egrep을 사용하면 한방에...

netstat -ant | egrep '(ESTABLISHED|LISTEN)'

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

shell 조건 연산자  (0) 2012.02.11
chmod suid  (0) 2012.02.11
The GNU C Library Reference Manual  (0) 2012.02.10
vmstat  (0) 2012.02.09
SAR(System Activity Reporter)  (0) 2012.02.09
:

The GNU C Library Reference Manual

OS/리눅스 & 유닉스 2012. 2. 10. 08:56

http://database.sarang.net/study/glibc/0.htm

The GNU C Library Reference Manual

1. 안내문

2. 에러 보고

3. 메모리 할당

4. 문자 다루기

5. 문자열과 배열 유틸리티

6. 입출력 개요

7. 스트림에서의 입/출력

8. 저수준 입/출력

9. 파일 시스템 인터페이스

10. 파이프 와 FIFO

11. 소켓

12. 저수준 터미널 인터페이스

13. 수학 함수

14. 저수준 연산 함수들

15. 탐색과 정렬

16. 패턴 매칭 ( Pattern Matching )

17. 날짜와 시간

18. 확장된 문자들

19. 지역과 세계화

20. 비-지역 탈출

21. 시그널 처리

22. 프로세스의 시동과 종료

23. 프로세스

24. 작업 제어

25. 사용자와 그룹

26. 시스템 정보

27. 시스템 구성 파라미터

부록 A. 라이브러리에 있는 C 언어 기능들

부록 B. 라이브러리 기능들의 요약

부록 C. 라이브러리 유지보수

부록 D. GNU LIBRARY GENERAL PUBLIC LICENSE

  • 서론
  • 복제, 배포 와 수정에 대한 제한과 조건

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

chmod suid  (0) 2012.02.11
egrep 정규식  (0) 2012.02.11
vmstat  (0) 2012.02.09
SAR(System Activity Reporter)  (0) 2012.02.09
gettimeofday  (0) 2012.02.04
:

vmstat

OS/리눅스 & 유닉스 2012. 2. 9. 17:00

리눅스의 메모리, CPU, IO 등을 확인할 수 있는 유용한 명령어로 vmstat과 sar가 있다.

1. vmstat 5 와 같이 하면 5초 간격으로 모니터링 정보를 갱신하며 보여준다. 해당 항목들의 의미와 점검점은 다음과 같다.

구분
설명
proc r CPU에서 대기 중인 프로세스의 수를 의미한다. 이 값이 증가하거나 r 개수/cpu 개수의 값이 항상 2 이상 나온다면 CPU의 성능을 높여주어야 한다.
b 동작하는 블럭 프로세스의 수
이 값이 높다면 블럭 디바이스의 속도를 높여야 한다.
w swap out되는 프로세서의 수이다.w에 값이 증가하면 메모리가 매우 부족하다는 의미이므로 메모리를 늘려야 한다.
memory(KB) swapd 현대 메모리가 부족해 swap을 사용하고 있는 양을 의미한다. 평소에 이 값이 높다고 해도 free 메모리의 여유가 있다면 메모리가 부족한 것이 아니다. 한번 swap으로 떨어진 프로레스는 메모리의 여유가 생기더라도 CPU에서 다시 호풀하지 않는 한 메모리로 넘어 오지 않는다.
free 현재 사용하지 않고 남아 있는 메모리
buffer 버퍼로 사용되고 있는 메모리 양(퍼포먼스에 관련)
cache 현재 캐시로 사용되고 있는 메모리 양(퍼포먼스에 관련)
swap(KB/s) si 디스크에서 메모리로 swap in 되는 양을 의미하며, swap 공간에 있는 데이터를 실제 메모리로호출한다.
so 메모리에서 디스크로 swap out 되는 양을 의미하며, 이는 곧 메모리가 부족해 실제 메모리에 있는 데이터를 swap 공간으로 보내는 것이다.
io(blocks/s) bi/bo bi는 초당 블럭 디바이스로 보내는 블럭 수이며 bo는 블럭 디바이스로부터 받은 블럭 수이다. 이 두 값이 높다는 것은 I/O 즉 하드디스크에 읽고 쓴느 값이 많다는 것이다.
system in 초당 인터럽트되는 양이다. 여기에는 time clock과 이더넷의 패킷도 포함되는데 즉 인터럽트의 수가 많다면 네트워크 쪽을 점검해볼 필요가 있다.
cs 초당 context switch되는 양이다. CPU에사 실행하는 명령들이 자신의 우선순위보다 높은 명령이 오거나 혹은 자신에게 할당된 CPU 점유 시간이 만료되면 우선순위에서 밀리게 되고 이때 context switch가 발생하게 된다.
cpu us 유저 프로세스가 CPU를 사용하는 시간
sy 시스템 프로세스가 CPU를 사용하는 시간
id CPU가 아무 일도 하지 않고 여유 있는 시간

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

egrep 정규식  (0) 2012.02.11
The GNU C Library Reference Manual  (0) 2012.02.10
SAR(System Activity Reporter)  (0) 2012.02.09
gettimeofday  (0) 2012.02.04
쓰레드, 시그널2  (0) 2012.02.02
:

SAR(System Activity Reporter)

OS/리눅스 & 유닉스 2012. 2. 9. 16:59

SAR(System Activity Reporter) 명령어를 이용한 시스템 관리

=============================================================

sar 주기 몇회  ex) sar 3 5 -> 3초간격으로 5번 운영체제 활동상황 출력(많이 쓰임)

%usr -> 사용자가 쓰는 CPU부하
%sys -> 시스템이 쓰는 CPU부하
%wio -> 디스크 IO가 쓰는 CPU부하
%idle -> 놀고 있는 CPU부하

============================================================== 

sysstat 웹 사이트 (http://perso.wanadoo.fr/sebastien.godard/)

 

sar 명령어는 solaris, unix, linux 등에서 유용하게 쓰는 프로그램이다.

sar는 redhat 7.x 이상에 기본 들어있는 sysstat 패키지에 있는 프로그램이다.

sar 프로그램은 시스템의 다양한 활동에 대하여 모니터링을 할 수 있는데 모니터링 대상이 상당히 넓은 편이다.

기본값은 CPU 활동에 대한 통계를 출력한다.

sar는 각종 활동에 대한 통계를 다른 프로그램을 이용하여 파일로 저장하고 통계치를 reporting하는 기능을 제공한다.

sar명령은 sadc에서 생성한 daily activity 화일을 읽어서 보고서를 작성하기도 하고, 시스템의 활동상황을 수집할 수도 있다.

 

sar에서 모니터링 가능한 항목은 다음과 같다. 

- I/O 전송량 - 페이징- 프로세스 생성 숫자

- 블락 디바이스 활동

- 인터럽트 - 네트워크 통계

- run 큐 및 시스템 부하 평균

- 메모리와 스왑 공간 활용 통계

- 메모리 통계

- CPU 이용도

- 특정 프로세스에 대한 CPU 이용도

- inode, 파일, 기타 커널 테이블에 대한 상태

- 시스템 스위칭 활동(context switch)

- 스와핑 통계 - 특정 프로세스 통계

- 특정 프로세스의 자식 프로세스 통계

- TTY 디바이스 활동

 

다시 얘기 하지만.. 항상 모르기 때문에 help라는 넘을 이용해서 도움받자~~!!!

 

1. sysstat 설치

다운로드 http://perso.orange.fr/sebastien.godard/download.html

 

sysstat는 몇몇 프로그램을 같이 가지고 있다.. 그중에서 sar프로그램을 보자~!!!!

 

[root@localhost kjb4310]# sar --help
sysstat version 5.0.5

(C) Sebastien Godard
Usage: sar [ options... ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -b ] [ -B ] [ -c ] [ -d ] [ -H ] [ -h ] [ -i <interval> ] [ -q ]

[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { <irq> | SUM | ALL | XALL } ] [ -P { <cpu> | ALL } ]
[ -n { DEV | EDEV | SOCK | FULL } ]
[ -x { <pid> | SELF | ALL } ] [ -X { <pid> | SELF | ALL } ]
[ -o [ <filename> ] | -f [ <filename> ] ]
[ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]

 

sar [ -abcdgkmpqruvwxyADSC] [-o file] t [n] sar [ -abcdgkmpqruvwxyADSC] [ -s time] [-e time] [ -i sec] [-f file]

처음형태는 운영체제의 활동상황을 매 t초마다 n번 수행하여 누적한다. t는 반드시 주어야 하는 인수고 그렇지 않으면

두번째 형태의 명령으로 인식하여 실행한다.

 

sar의 명령어를 그냥 쳤을 경우에는... -u 옵션이 적용된다.~!!!!

 

■ sar -A : 모든 관련정보를 출력한다

 

■ [root@localhost kjb4310]# sar | more
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초       CPU     %user     %nice   %system   %iowait     %idle
00시 10분 01초       all     32.42      0.00     13.50      0.00     54.07
00시 20분 01초       all     32.30      0.00     13.36      0.00     54.33
.

Average:            all     33.42      0.00     14.01      0.00     52.57

[root@localhost kjb4310]# sar 5 2 => 5초 2번 필터링 하라 요런 얘기
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

14시 29분 38초       CPU     %user     %nice   %system   %iowait     %idle
14시 29분 43초       all     65.65      0.00     25.16      0.00      9.19
14시 29분 48초       all      0.92      0.00      0.00      0.00     99.08

.

Average:          all     33.29      0.00     12.58      0.00     54.13

■ [root@localhost kjb4310]# sar -b | more  =>>> 버퍼의 액티비티를 점검,  I/O 와 transfer 의 통계를 백분율로 출력한다.
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초       tps      rtps      wtps   bread/s   bwrtn/s
00시 10분 01초      0.00      0.00      0.00      0.00      0.00
00시 20분 01초      0.00      0.00      0.00      0.00      0.00
.

Average:         0.00      0.00      0.00      0.00      0.00

 

* tps : 물리적 디스크에서 발생되어진 초당 전송량. 여기서 전송은 물리적 디스크에 요청한 I/O 이다 
* rtps : 물리적 디스크로부터 발생된 초당 읽기 총 요청 횟수

* bread/s : 드라이브 안의 블럭에서 초당 읽은 데이타의 총합. 블럭은 부정확한 사이즈의 블럭이다.

* bwrth/s : 드라이브 안의 블럭에서 초당 쓰여진 데이타의 총합

※ 중요한 것은 %rcache와 %wcache는 버퍼의 실질적인 값으로 %rcache가 90 이하로 떨어지거나,

%wcache의 값이 65 이하로 측정되었을 경우에는 성능을 증가시킬 수 있다.

 

■ [root@localhost kjb4310]# sar -B | more  =====>>>> -B : 페이징 통계를 출력한다.
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초  pgpgin/s pgpgout/s   fault/s  majflt/s
00시 10분 01초      0.00      3.21     21.94      0.00
00시 20분 01초      0.00      3.06      9.95      0.00

* pgpgin/s : 디스크로부터 초당 paged in 된 page 의 총 수 
* papgout/s : 디스크에 초당 paged out 된 page 의 총 수 

■ [root@localhost kjb4310]# sar -c | more  ====>>>>> 새롭게 만들어져 활동하고있는 프로세스를 출력한다.
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초    proc/s
00시 10분 01초      0.04

.

Average:         0.05

 

■ [root@localhost kjb4310]# sar -d | more
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초       DEV       tps  rd_sec/s  wr_sec/s
00시 10분 01초    dev1-0      0.00      0.00      0.00
00시 10분 01초    dev1-1      0.00      0.00      0.00
00시 10분 01초    dev1-2      0.00      0.00      0.00

.

Average:       dev1-0      0.00      0.00      0.00
Average:       dev1-1      0.00      0.00      0.00
Average:       dev1-2      0.00      0.00      0.00

 

■ [root@localhost home2]# sar -e 09:00:00 -f  
Linux 2.6.20 (localhost.localdomain)    2007년 06월 12일

00시 00분 01초       CPU     %user     %nice   %system   %iowait     %idle
00시 10분 01초       all     53.79      0.00     22.42      0.00     23.79
00시 20분 01초       all     53.70      0.00     22.36      0.00     23.95


리포트의 종료시간을 설정한다,기본 ending time 은 18:00:00 이다. 
시간표시형식은 24시간 format 을 사용해야한다. 이 옵션은 -f 또는 -o 옵션과 함께 사용되어져야한다

위의 내용은 /var/log/sa/sa## 파일에서 09:00:00 까지의 기록들만 출력하였다

 

■ [root@localhost kjb4310]# sar -f | more
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초       CPU     %user     %nice   %system   %iowait     %idle
00시 10분 01초       all     32.42      0.00     13.50      0.00     54.07
00시 20분 01초       all     32.30      0.00     13.36      0.00     54.33
.

Average:          all     33.45      0.00     14.03      0.00     52.51

 

 -f filename : filename 으로부터 기록을 출력한다. 
filename 은 -o 옵션을 사용해서 생성된파일과 같은 종류의 파일이다. 
기본 데이타 filename은 /var/log/sa/ad## 파일 들이다. 
-f 옵션과 -o 옵션은 함께 사용할수 없다.
 

■ sar -h : 언제 테이타를 파일로부터 읽었는지를 나타낸다. 이것의 출력 형식은 프로세싱 
명령어인 awk 처럼 쉽다. 출력은 tab으로 컬름이 구분되어 이루어졌다. 컬름은 
다음과 같다. hostname,interval value,timestamp,device name,field name and value 
로 구성되어 있다. 

■ sar -i interval : 몇초간격으로 테이타를 출력할것인가를 결정한다.

 

■ sar -n DEV | EDEV | SOCK | FULL : 네트워크통계를 출력한다.

* DEV : Network Device의 결과로 부터의 통계 

 - IFACE : Network Interface 이름 
 - rxpck/s : 초당 받은 패킷수 
 - txpck/s : 초당 전송한 패킷수 
 - rxbyt/s : 초당 받은 bytes 
 - txbyt/s : 초당 전송한 bytes 
 - rxcmp/s : 압축된 패킷을 초당 받은 수 
 - txcmp/s : 압축된 패킷을 초당 전송한 수 
 - rxmcst/s : 초당 받은 다중 패킷 수 

* EDEV : Network Device 의 에러 통계 

 - IFACE : Network Interface 이름 
 - rxerr/s : 초당 불량 패킷을 받은 수 
 - txerr/s : 패킷전송중 초당 발생한 에러 수 
 - coll/s : 패킷전송중 초당 발생한 충돌 수 
 - rxdrop/s : 리눅스 buffer 의 부족으로 패킷을 받는도중 초당 drop 된 패킷 수 
 - txdrop/s : 리눅스 buffer 의 부족으로 전송중 초당 drop 된 패킷 수 
 - txcarr/s : 패킷전송도중 초당 발생한 carrier-error 수 
 - rxfram/s : 패킷을 받는도중 초당 발생한 frame alignment 에러 수 
 - rxfifo/s : 패킷을 받는 도중 초당 발생한 FIFO overrun 에러 수 
 - txfifo/s : 전송된 패킷중 초당 발생한 FIFO overrun 에러 수 

* SOCK : Socket 의 통계 

 - totsck : 총 사용된 socket 수 
 - tcpsck : 현재 사용중인 TCP sockets 수 
 - udpsck : 현재 사용중이 UDP sockets 수 
 - rawsck : 현재 사용중인 RAW sockets 수 
 - ip-frag : 현재 사용중인 IP fragments 수  

* FULL : 모든 종류의 Keywords(DEV,EDEV,SOCK) 내용을 출력한다.

■ sar -o filename : 파일을 읽어서 binary 형태로 저장한다.

sar -o kjb4310-i 1 5   ====>>  1초 간격으로 5 개의 결과치를 kjb4310 이라는 파일로 저장했다

sar -f kjb4310   ====>>>  -f 옵션으로 저장된 kjb4310파일을 출력한다.

 

■ [root@localhost kjb4310]# sar -q | more   =>> 실행 대기 큐에 있는 프로세스 점검, 시스템의 load avarage를 나타낸다.
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
00시 10분 01초         0       233      4.02      3.62      3.66
00시 20분 01초         0       231      3.29      3.51      3.57
.

Average:            4       232      3.85      3.84      3.80

runq-sz plist-sz ldavg-1 ldavg-5 순으로 보여주며 각각 프로세스 대기 시간과 전체 프로세스 수,

그리고 1분 전 및 5분전 평균 작업 부하 정보를 보여줍니다

 

■ [root@localhost kjb4310]# sar -r | more        =>>>>>  가용메모리 점검, 메모리 & 스왑 공간의 이용 통계를 출력한다
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초 kbmemfree kbmemused  %memused kbbuffers  kbcached kbswpfree kbswpused  %swpused  kbswpcad
00시 10분 01초    122972      3503004          96.61        41424      2650904     5220508        608               0.01          0
00시 20분 01초    146344      3479632          95.96        41580      2644832     5220508        608               0.01          0
.

Average:           130010   3495966     96.41     40450   2638289   5220508       608      0.01         0
※ 가용 메모리가 인스톨된 메모리의 6%보다 계속해서 작으면 가용 메모리가 부족하다는 것

 

* kbmemfree : 사용가능한 총 메모리의 양(kbytes) 

* kbmemused : 사용중인 총 메모리의 양(kbytes), 커널에서 사용중인 메모리는 제외 

* %memused : 사용된 메모리의 % 

* kbmemshrd : 시스템에서 공유메모리로 사용된 총 메모리의 양 (kbytes) 

* kbbuffers : 커널에서 buffer 메모리로 총 사용된 메모리의 양 (kbytes) 

* kbcached : 커널에서 cache data 로 사용된 총 메모리의 양(kbytes) 

* kbswpfree : 사용가능한 스왑공간의 양 (kbytes) 

* kbswpused : 사용된 스왑공간의 양 (kbytes) 

* %swpused : 사용된 스왑공간의 %

 

■ sar -R : 메모리 통계 

* frmpg/s : 시스템에서 초당 자유로워진 memory pages 의 양 
페이지의 크기는 시스템 아키텍쳐에따라 달라지며 보통 4K / 8K 이다. 

* shmpg/s : 시스템에서 초당 더해진 memory pages 의 양 

* bufpg/s : 시스템에서 초당 buffer 에 추가적으로 더해진 memory pages 의 양 

■ sar -s hh:mm:ss : 명령어를 실행시킬 시작시간을 설정한다. 
이 옵션은 파일로부터 데이트를 읽을때만 사용가능하다 ( 옵션 -f )

 

ex. [root@kjb4310]# sar -s 14:01:00 kjb4310
 kjb430 라는 파일에 저장된 데이타중에 시간이 14:01:00 이상인것들만 출력한다.

여기서 kjb4310 라는 파일은 -f 옵션을 사용해서 만든 파일이다.

 

■ sar -u : CPU 사용 통계 

* %user : 사용자 레벨(application level) 에서 실행중일때의 CPU 사용률 (%) 

* %nice : 사용자 레벨(appliaction level) 에서 nice 가중치를 준 CPU 사용률(%) 

* %system : 시스템레벨(kernel) 에서 실행중일때의 CPU 사용률(%) 

* %idle : CPU가 쉬고있는 시간의 % 

■ sar -v : 커널테이블 & 파일 에서 inode 의 상태를 출력한다. 

* dentunusd : Directory cache 에서 사용되고있지 않은 cache entries 

* file-sz : file handles 의 사용양 

* %file-sz : 리눅스 커널에서 할당가능한 최대 파일핸들의 수에대한 파일핸들의 사용된 퍼센트(%) 

* inode-sz : inode handles 의 사용양 

* super-sz : 커널에의해 할당된 super block handles 의 수 

* %super-sz : 리눅스가 할당 가능한 최대 슈퍼블럭핸들에대한 실제로 할당되어진 슈퍼블럭핸들의 퍼센트(%) 

* dquot-sz : Disk quota entryes 의 수 

* %dquot-sz : 최대할당가능한 disk quota entries 에 대한 실지로 할당된 entries의 퍼센트(%)

 

■ [root@localhost kjb4310]# sar -w | more   ====>>>>> 시스템의 switching 활동 현황 출력
Linux 2.6.20 (localhost.localdomain)    2007년 06월 07일

00시 00분 01초   cswch/s
00시 10분 01초      0.00
00시 20분 01초      0.00
.

Average:         0.00

 

* cswch/s : 초당 context switching 의 수 

■ sar -W : swapping 의 통계 출력 

* pswpin/s : 초당 swap in 된 수 
* pswout/s : 초당 swap out 된 수

sar 설정하기

 

# cat /etc/cron.d/sysstat

# run system activity accounting tool every 10 minutes

*/10 * * * * root /usr/lib/sa/sa1 1 1

# generate a daily summary of process accounting at 23:53

 53 23 * * * root /usr/lib/sa/sa2 -A

sa1 는 매10분마다 시스템모니터링한 결과를 /var/log/sa/saxx 파일에 바이너리 형태로 기록한다. xx는 기록하는 날짜이다.

sa2 -A 는 23시 53분에 바이너리 파일을 읽어서 사람이 편하게 볼 수 있도록 보고서를 만든다. /var/log/sa/sarxx 형태로 기록된다. sa1 에서 5 3 이라고 해놓으면 매 10분마다 실행을 하면서 5초동안 3번을 기록한다는 뜻이다.

그러면 매10분마다 15번의 기록이 남는다. sa2 에서 -A는 모든 데이터를 보는 것인데 실제로는 자신에게

필요한 내용만 옵션을 이용하여 뽑아서 보는 것이 편할 것이다.

man 페이지의 예를 참고하면 된다.

 # 8am-7pm activity reports every 10 minutes during weekdays. 
0 8-18 * * 1-5 /usr/lib/sa/sa1 600 6 & 
# 7pm-8am activity reports every an hour during weekdays. 
0 19-7 * * 1-5 /usr/lib/sa/sa1 & 
# Activity reports every an hour on Saturday and Sunday. 
0 * * * 0,6 /usr/lib/sa/sa1 & 
# Daily summary prepared at 19:05 
5 19 * * * /usr/lib/sa/sa2 -A & 

서비스에 따라 다르겠지만 sa2 에서 자세히 보아야 할 부분들은 다음과 같다. -r 메모리 및 스왑 스페이스 사용현황,

-u CPU 활용량, -W 스와핑 상황. -q load average

# sar -ruW -f sa27 3600 -> 메모리, cpu, 스왑 레포트를 sa27에서 만들며 3600초(1시간) 기준으로 만든다. 
# sar -r -f sa25 1800 -s 08:00:00 -e 19:00:00 -> 오전 8시부터 저녁 19시가지 30분간격으로 메모리 모니터링 

[출처] sar 명령어|작성자 프론티어

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

The GNU C Library Reference Manual  (0) 2012.02.10
vmstat  (0) 2012.02.09
gettimeofday  (0) 2012.02.04
쓰레드, 시그널2  (0) 2012.02.02
쓰레드, 시그널  (0) 2012.02.02
:

gettimeofday

OS/리눅스 & 유닉스 2012. 2. 4. 09:21

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>

 

E_SMS_ERRCODE __FC_Sms_SetCurrentTime(
    T_SMS_SENDPARAM *       pParam,
    struct tm *ptm)
{
    struct timeval tv;
    struct tm *ptm;
    long milliseconds;
    long microseconds;

 

    gettimeofday(&tv, NULL);
    ptm = localtime (&tv.tv_sec);

 

    pParam->year = ptm->tm_year + 1900;
    pParam->month = ptm->tm_mon +1;
    pParam->day = ptm->tm_mday;
    pParam->hour = ptm->tm_hour;
    pParam->minute = ptm->tm_min;
    pParam->second = ptm->tm_sec;

 

    // Get microseconds
    microseconds = tv.tv_usec;
    // Compute milliseconds from microseconds 
    milliseconds = tv.tv_usec / 1000;

 

    return SMS_RET_OK;
}

 void print_time ()
{
struct timeval tv;
struct tm* ptm;
char time_string[40];
long milliseconds;

/* Obtain the time of day, and convert it to a tm struct. */
gettimeofday (&tv, NULL);
ptm = localtime (&tv.tv_sec);


 /* Format the date and time, down to a single second. */
strftime (time_string, sizeof (time_string), "%Y-%m-%d %H:%M:%S", ptm);


 /* Compute milliseconds from microseconds. */
milliseconds = tv.tv_usec / 1000;


 /* Print the formatted time, in seconds, followed by a decimal point
   and the milliseconds. */
printf ("%s.%03ld\n", time_string, milliseconds);
}

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

vmstat  (0) 2012.02.09
SAR(System Activity Reporter)  (0) 2012.02.09
쓰레드, 시그널2  (0) 2012.02.02
쓰레드, 시그널  (0) 2012.02.02
signal set 관련 함수 (sigemptyset, sigaddset, sigdelset, sigprocmask)  (0) 2012.02.01
:

쓰레드, 시그널2

OS/리눅스 & 유닉스 2012. 2. 2. 09:13
http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=2663&


JOINC.co.kr

쓰레드와 시그널

Date: 2003/10/27

Topic: 시스템 프로그램

윤상배: dreamyun@yahoo.co.kr

 

 

그렇잖아도 애매 모호한 쓰레드에 헷갈리는 시그널을 사용하고자 하면 여러 가지 애로 사항이 꽃피게 된다. 각 쓰레드별로 시그널이 전달되거나 전달되지 않도록 설정할 수 있어야 하기 때문인데, 개념적으로는 간단하지만 막상 적용하려면 그 과정이 머리에 그려지지 않기 때문이다.

 

1절. 쓰레드에서의 시그널 사용

 

쓰레드에서의 시그널 사용은 시그널에 대한 기본적인 이해만 가지고 있다면 약간의 응용으로 충분히 해결할 수 있는 문제이긴 하지만 범 유닉스적으로 응용하고자 한다면(특히 리눅스가 포함된다면) 운영체제 간 신경써줘야 할 문제가 있다. 이번 장에서는 쓰레드에서의 시그널을 이용하는 방법과 운영체제가 다름으로 인해 발생할 수 있는 문제들에 대해서 알아보도록 하겠다.

 

1.1절. 시그널을 특정 쓰레드로 보내기

 

쓰레드에서 시그널은 서로 공유된다는 걸 알고 있을 것이다. 문제는 공유된다는 점인데 만약 프로세스에 시그널을 보낼 경우 해당 프로세스에서 생성된 모든 쓰레드에 시그널이 전달이 되게 된다. 이것은 우리가 원하는게 아니다.

 

우리가 원하는 것은 특정 쓰레드에서만 시그널을 받도록 하는 것이다. 이러한 작업을 위해서 우리는 시그널 마스크를 사용한다. 시그널 마스크는 말 그대로 특정 시그널에 대해서 마스크를 씌우는 것으로 해당 쓰레드에서 특정 시그널에 대해서 마스크를 씌우면 마스킹된 시그널은 해당 쓰레드로 전달되지 않는다. 이 시그널을 받기를 원하는 쓰레드에서는 이 시그널에 대한 마스크를 제거시킨다. 그러면 블록되어 있는 시그널은 마스크가 제거된 쓰레드로 전달 될 것이다. 일종의 필터기다.

 

그림 1. 시그널 마스크의 작동원리

 

위의 그림은 시그널 마스크의 작동 원리를 보여준다. 메인 쓰레드에서는 SIGINT와 SIGUSR2에 대해서 시그널 마스크를 설치한다. 그리고 쓰레드 1에서는 SIGINT에 대한 마스크를 제거하고, 쓰레드 2에서는 SIGUSR2에 대한 마스크를 제거한다. 이렇게 되면 SIGINT가 메인 쓰레드에 도착했을 때 마스크 때문에 메인 쓰레드에는 도착하지 못하고 쓰레드 1로 전달될 것이다. SIGUSR2가 도착했을 경우 메인 쓰레드와 쓰레드 1에서는 마스크 때문에 전달되지 못하고 쓰레드 2로 시그널이 전달된다. 1.1.1절에서는 위의 작동 원리대로 구현된 예제 코드를 다루고 있다.

 

이러한 쓰레드별 시그널 마스킹을 위해서 pthread는 pthread_sigmask(3)라는 함수를 제공한다.

#include <pthread.h>
#include <signal.h>

 

int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);

 

이 함수는 현재 쓰레드에 시그널 newmask와 how를 이용해서 시그널 마스크를 만든다. how는 SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK 중 하나를 선택할 수 있다. SIG_BLOCK은 현재 설정된 시그널 마스크에 newmask를 추가하며 SIG_UNBLOCK은 현재 설정된 시그널 마스크에서 newmask를 제거하고 SIG_SETMASK는 newmask로 현재 시그널 마스크를 설정한다.

 

1.1.1절. 간단 예제

 

그럼 pthread_mask(3)를 이용한 간단한 예제를 만들어 보도록 하겠다. 코드는 여러분이 시그널과 쓰레드에 관한 최소한의 지식을 가지고 있다는 가정하에 작성될 것이며, 설명은 주석으로 대신하도록 하겠다.

 

예제 : th_signal.c

위 프로그램을 실행시킨 뒤 kill 명령으로 SIGINT와 SIGUSR2 시그널을 PID로 보내보면 해당 쓰레드로 시그널이 전달되고 시그널 핸들러가 실행되는 걸 확인할 수 있을 것이다.

 

1.2절. 쓰레드 간 시그널 전송

 

외부의 다른 프로세스에서 시그널을 발생시키는 것 외에도 같은 프로세스에서 작동하는 쓰레드 간에 시그널을 전송해야 하는 경우도 생길 것이다.

 

이러한 쓰레드 간 시그널 전송은 여러 가지 목적으로 사용할 수 있다. 일정 시간마다 특정 쓰레드에 시그널을 전송하므로써 쓰레드를 깨워서 코드를 실행시키게 한다거나 네트워크 애플리케이션에서 write, read에 타임아웃을 검사하는 용도로도 사용 가능하다.

 

네트워크 애플리케이션에서 스레드 간 시그널 전달을 통해 타임아웃을 검사한다는 생각은 좀 생소할 수도 있을 것 같다. 보통은 select나 alarm을 사용할 건데, 멀티 쓰레드 프로그램의 경우 alarm(2)의 사용은 사실상 어렵다고 볼 수 있다. 여러 개의 쓰레드에서 alarm(2)를 사용할 경우 단지 하나의 alarm(마지막 alarm 값)만이 등록되어서 사용할 수 있기 때문이다. 그렇다면 select를 사용해야 할 건데, select 대신에 전용의 시그널을 발생하는 쓰레드를 이용해서 사용할 수 있다.

 

read(2)를 예로 들어서 설명해 보자 read(2)를 하기 전에 특정 (전역) 값을 0으로 세팅하고 read를 수행한 후 1로 값을 변경하도록 한다. 그리고 타임아웃 체크를 위한 쓰레드에서는 타임아웃 시간 간격으로(sleep(2)를 이용하면 된다) 이 값을 검사한다. 만약 값이 0으로 세팅되어 있는 걸 확인 했는데, 다음 시간이 돌아온 뒤에도 이 값이 0이라면 read 영역에서 타임아웃이 발생했다고 판단 할 수 있을 것이다. 그러면 타임아웃이 발생한 쓰레드에 시그널을 전송하도록 한다. 쓰레드에 시그널을 전송하면 인터럽트가 발생하고 read에서 빠져나오게 된다.

if (read(..) < 0)
{
        // 만약 인터럽트로 인하여 빠져나온 거라면..
        if (errno == EINTR)
        {
                ...
        }
}

시그널 발생시 인터럽트가 전달되게 하려면 약간의 부가적인 작업이 필요한데, 이것은 소켓 타임아웃을 참고하기 바란다.

 

1.2.1절. 다른 쓰레드로 시그널 전송

 

이러한 쓰레드 간 시그널 전송을 위해서 pthread_kill(3)가 제공된다.

#include <pthread.h>
#include <signal.h>


int pthread_kill(pthread_t thread, int signo);

 

첫 번째 인자 thread는 시그널을 전달받을 쓰레드의 식별자이고 signo은 전달하고자 하는 시그널 번호이다. 보내는 쪽은 pthread_kill(3)을 이용해서 비교적 간단하게 구현이 가능하다.

 

1.2.2절. 시그널받기

 

시그널을 받는 쓰레드의 경우 동기와 비동기 두 가지 방식을 통해서 받을 수 있다. 동기 방식으로 받을 경우는 sigwait(3) 함수를 이용해서 시그널이 전달될 때까지 블록되면서 기다린다.

#include <pthread.h>
#include <signal.h>

 

int sigwait(const sigset_t *set, int *sig);

 

이 함수는 시그널 set에 설정된 시그널 중 하나가 전달될 때까지 호출된 영역에서 대기한다. 시그널을 받았다면 리턴되고 전달 받은 시그널 번호는 sig를 통해서 넘어온다. 시그널을 기다린다는 특징을 이용해서 쓰레드 간 동기화를 위한 목적으로도 유용하게 사용할 수 있을 것이다.

 

두 번째는 비동기적인 방식으로 코드 실행 중에 시그널이 전달되면 인터럽트가 걸리고 시그널 핸들러가 수행되는 방식이다. 일반적인 시그널 사용 방식과 동일하다.

 

1.2.3절. 예제

 

sigwait(3)를 통해서 동기적으로 기다리는 것은 구현이 간단하므로 따로 다루지 않고 시그널 핸들러를 등록해서 비동기적으로 시그널을 기다리는 코드를 구현해 보도록 하겠다. 1.1.1절의 코드를 약간 수정했다.

 

예제 : thtoth_sig.c

위의 코드의 경우 시그널을 받을 쓰레드를 명시해줄 수 있으므로 시그널 마스크 등을 설치할 필요가 없다. SIGINT가 원하는 쓰레드로 정확하게 전달되는 걸 확인할 수 있을 것이다.

 

1.3절. 운영체제별 차이점

 

쓰레드의 작동 방식은 운영체제별로 많은 차이를 보여줄 수 있으며, 차이점에 유의해서 프로그램을 작성해야 한다. 여기에서는 솔라리스와 리눅스를 비교해서 설명하도록 하겠다.

 

지금까지의 쓰레드와 시그널에 대해서 다루었던 내용은 솔라리스와 같이 하나의 프로세스에서 다중의 쓰레드를 관리하는 경우를 기준으로 했다. 그러나 리눅스의 경우 clone(2)를 통한 다중 프로세스 형태로 쓰레드가 생성된다. 때문에 ps를 이용해서 확인할 경우 다중 쓰레드 프로세스임에도 불구하고 각각의 PID를 가지는 프로세스로 쓰레드가 생성되는걸 확인 할 수 있다.

 

이런 특징 때문에 리눅스 시스템에서 외부 프로세스에서 시그널을 특정 쓰레드로 보낼 경우에는 메인 쓰레드가 아닌 해당 쓰레드의 PID를 명시해 주어야 한다.

 

This article comes from Joinc

http://www.joinc.co.kr

 

출처: http://www.sungjae.pe.kr

 

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

SAR(System Activity Reporter)  (0) 2012.02.09
gettimeofday  (0) 2012.02.04
쓰레드, 시그널  (0) 2012.02.02
signal set 관련 함수 (sigemptyset, sigaddset, sigdelset, sigprocmask)  (0) 2012.02.01
pthread_kill  (0) 2012.02.01
:

쓰레드, 시그널

OS/리눅스 & 유닉스 2012. 2. 2. 09:13

1. signal handling in Multi-threaded applications

 

쓰레드 어플리케이션이 아닌경우 시그널 처리에는 3가지 방법이 있다.

1. 시그널에 대해 아무런 처리도 하지 않는다.(디폴트 액션을 취하겠다)

2. signal()을 이용해서 시그널 핸들러를 설정한다.

3. sigprockmask()와 sigaction()을 이용해서 특정시그널을 무시하거나, 시그널 핸들러를 설정해 준다.

 

3번을 강력히 추천!!

 

쓰레드 어플리케이션으로 gogo~

 

쓰레드와 시그널에 대한 질문 몇가지에 대한 답을 알아보면서 시작하자.

 

질문 1) 시그널이 어플리케이션으로 전달될 경우 어떤 하나의 쓰레드가 받나요? 아니면 모든 쓰레드가 받게되나요?

- 한개의 시그널은 오직 하나의 쓰레드로만 전달된다.

 

질문 2) 그럼 어떤 쓰레드가 시그널을 받게 되나요?

- 경우의 수는 2가지

    1. Synchronous signal - 시그널을 발생한 쓰레드에게로 간다.

    2. Asynchronous signal - 어떤 쓰레드에게나 갈 수 있다.즉, 랜덤하다는 이야기다.

  당연한 이야기다. 왜냐하면 Synchronous signal이라는건 프로그램의 액션에 의해 발생하는 시그널이고, 고로, 그 액션

  을 실행한 쓰레드에게 시그널이 가도록 되어있다. Asynchronous signal은 프로그램 독립적인 시그널이다. 예를 들면

  kill()을 이용해서 시그널을 프로세스에 보낼 경우가 해당된다. 고로, 어떤 쓰레드가 받을지는 예측 불허하다.

 

질문 3) 쓰레드는 부모의 signal mask값을 상속받을까요?

- 상속받는다. 예를 들면, 부모가 모든 시그널을 block 할 경우, 새롭게 생성되는 쓰레드는 모든 시그널이 block 되어있다.

 

쓰레드에서 시그널 처리를 위한 가장 좋은(개인적인..)모델은 모든 쓰레드에서 시그널을 block 하고, main thread만이 시그널을 처리하는 것이다.

 

void sighandle(void)

{

while (1)

{

sigwait(&sigset, &signum)

switch (signum)

{

case SIGXXX:

beak;

 

case SIGYYY:

break;

}

}

}

main()

{

/* 관심있는 시그널을 sigset에 등록하고 block */

sigaddset(&sigset, 시그널 1);

sigaddset(&sigset, 시그널 2);

 

pthread_sigmask(SIG_BLOCK, &sigset, NULL);

 

/* 이후 생성되는 모든 쓰레드는 관심 시그널이 block되어있으므로 main()에서만 sighandle()을 호출해서 관심

시그널을 처리한다 */

 

 

/* 쓰레드 생성 ... */

 

sighandle();

}

 

이런 흐름으로 code를 만들면 될 것 같다(개인적인 판단이다)

[출처] 쓰레드 #2|작성자 복스

'OS > 리눅스 & 유닉스' 카테고리의 다른 글

gettimeofday  (0) 2012.02.04
쓰레드, 시그널2  (0) 2012.02.02
signal set 관련 함수 (sigemptyset, sigaddset, sigdelset, sigprocmask)  (0) 2012.02.01
pthread_kill  (0) 2012.02.01
시그널, signal  (0) 2012.02.01
: