grep , sed, awk 정규식
OS/리눅스 & 유닉스 2012. 1. 5. 08:33'OS > 리눅스 & 유닉스' 카테고리의 다른 글
vi 에디터 문자열 치환 (0) | 2012.01.09 |
---|---|
sed 편집기 (0) | 2012.01.05 |
SED 스트림 에디터 (0) | 2012.01.04 |
Bash 스크립팅 가이드 (0) | 2012.01.04 |
유닉스 itoa 구현 (0) | 2011.12.30 |
'OS'에 해당되는 글 130건grep , sed, awk 정규식OS/리눅스 & 유닉스 2012. 1. 5. 08:33
정규식이란 무엇인가 ?
어떤 문자열의 집합을 묘사하는데 사용되는 텍스트 스트링
정해진 구문 규칙에 따른다
Editor, Utillity, Programming 언어에서 텍스트 패턴을 기준으로 검색, 혹은 조작하는데 사용된다
보통 사람들이 쓰는 표현 중에도 그대로 문장을 해석하면 안 되는 관용구나, 숙어 같은 것 이 있듯이 컴퓨터도 동일하게 해석 하면 안되는 구문이 있는데, 이것을 정규식이라 한다
문자
의미
^
줄의 시작을 나타내지만 문맥에 따라서는 정규 표현식에서는 문자 집합의 의미를 반대로 해석해준다
ex) ^root 행의 제일 처음이 root
[^a-z] : 소문자 제외
[^a-z A-Z] : 알파벳 제외
*
바로 앞의 문자열이나 정규 표현식에서 0개 이상 반복되는 문자를 나타낸다
ex) 1133* : 113(o), stuadun(x), studenttttt(o), studenttyt(x)
/ 1* : 아무 것도 없거나, 1이 하나 이거나, 1이 반복되거나
find ./test* :test로 시작하는 모든 것
* : 전부 다
[ ]* : 집합 포함하고
.
새로운 라인을 제외한 오직 한 개의 글자와 일치 (space, tab 포함)
ex) st.den : .에는 아무 글자나 와도 된다
a..b : a로 시작하고 b로 끝나는 5글자
$
줄의 끝과 일치하며, ^$의 경우 빈 줄과 일치함
[…]
문자들을 집합으로 묶어 줌(한 음절씩 매칭)
ex) [a-z] : 소문자 중 하나라도 일치
[a-z A-Z] : 소문자나 대문자
\
다음 사용을 위해 태그를 붙인다. (최대 9개)
ex) \$ : 정규 표현시에서 줄의 끝을 나타내는 의미대신 문자 그대로
\(……\)
다음 사용을 위해 태그를 붙인다. (최대 9개)
ex) \(pquhg\) .. .. .. .. .. \(aough\)
\1 \2
\<
단어의 시작 지시자
\>
단어의 끝 지시자
X\{n\}
문자 X를 n번 반복
X\{n,\}
문자 X를 적어도 n번 반복
X\{m,n\}
문자 X를 m번에서 n번 반복
ex) \<[a-z]\{4,5\}\> : 소문자를 4번에서 5번 반복하는 거
GREP
파일 전체를 뒤져 정교 표현식에 대응하는 모든 행들을 출력
기본 형식 : grep 'word' [filename]
ex) env | grep 'HOSTNAME' : 환경 변수 중에서 HOSTNAME을 찾음
Grep root /etc/shadow : /etc/shadow 파일에서 root라는 단어를 찾음
문자
의미
-b
검색 결과의 행 앞에 검색된 위치의 블록 번호 표시
검색내용이 디스크의 어디 쯤 있는지 위치를 알아내는데 유용
-c
검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력
ex) grep -c 'woo' file : woo라는 단어가 포함된 행의 총수를 출력
-h
파일 이름을 출력하지 않음
-i
대소문자를 구분하지 않음 (동일 취급)
ex) grep -i | 'sexy' file : 문자열 sexy가 어떠한 대소문자 조합으로 이루어져 있더라도 찾는다
-l
패턴이 존재하는 파일의 이름만 출력
ex) grep -l 'FU' * : 모든 검색 범위안에서 'FU'라는 단어가 들어가 있는 파일의 이름만 출력
-n
파일 내에서 행, 번호 출력
ex) grep -n '^hole' file : 파일에서 시작이 hole로 시작하는 행, 번호 출력
grep -n '^root' /etc/shadow : 루트로 시작하는 행, 번호 출력
-v
패턴이 존재하지 않는 행만 출력
ex) grep -v 'root' file > temp
Mv temp file : root가 포함되지 않는 모든 행 출력 (특정 내용 삭제하는데 좋다)
-w
패턴 표현식을 하나의 단어로 취급하여 검색
ex) grep -w 'me' file : 딱 me라는 단어가 있는 경우에만 찾음
grep + 정규식
ex) grep '[a-z]\{9\}' file : 소문자가 적어도 9개 이상 연속적으로 나오는 문자열을 포함한 모든 행을 출력
grep '\<a-z].*h\>' file : 소문자 하나로 시작하고, 이어서 임의의 수 여러문자가 나오며 h로 끝나는 단어가 포함된 모든 행 출력
grep '\.bak$' file : .bak으로 끝나는 행을 출력 . 작은 따음표는 $의 해석을 막는다
grep '[A-Z]…[0-9]' file : 대문자로 시작하고 숫자로 끝나는 다섯문자의 열이 포함된 행을 출력
ps -ef | grep "^"denodo" : user1로 시작하는 행을 검색하며 denodo앞에 0개 혹은 임의의 수 공백이 와도 상관 없다
EGREP
Grep에서 제공하지 않는 확장된 정규 표현식 메타 문자 사용
기본 형식 : egrep 'word' [filename]
문자
의미
+
선행 문자와 같은 문자의 1개 혹은 임의 개수와 대응 (1개 이상)
ex) egrep '1+' file : 숫자 1이 한번 이상 등장하는 행을 출력
Egrep 'yes+' file : yes가 한번 이상 연속해서 나오는 행 출력
?
성행 문자와 같은 문자의 0개 혹은 1개와 대응
ex) egrep '2\.?[0-9]' file : 숫자 2 다음에 마침표가 없거나 한번 나오고, 다시 숫자 하나가 오는 행을 출력
a | b
a혹은 b와 대응
ex) egrep 'WM|M' file : WM나 M이 포함된 행을 출력
Egrep 'S[s|x]' file : 문자 S다음에 s나 x가 오는 행 출력
( )
정규 표현식을 묶어준다
FGREP
fgrep은 grep명령어와 도일하게 동작하지만 정규표현식 메타문자들을 특별히 취급하지 않는다
기본형식 : fgrep '문자열' [filename]
ex) fgrep '[A-Z] … [0-9]' filename : 문자 [A-Z] … [0-9] 자체를 포함하는 문자열을 찾는다
AWK
기본형식 : awk 'patten' filename 조건
awk '{action}' filename 몇번째 필드
awk 'pattern {action}' filename 무슨 조건에 몇 번째 필드
1 (필드) 개행으로 구분한다
2 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어
3 입력 데이터로는 표준 입력, 여러 개의 파일 또는 다른 프로세스의 결과를 사용 할 수 있다
4 사용자가 지정한 패턴 검색이나 특별한 작업수행 위해 파일을 행 단위로 조사한다
5 $0은 모든 필드
awk '{print $1}' file
파일의 첫 번째 필드를 출력한다, 첫 번째 필드는
각 행의 맨 왼쪽 경계에서 시작 공백문자로 구분
awk '/BRAVE/{printf $1, $2}' file
파일에서 BRAVE를 포함하는 행들의 첫 번째와 두 번째 필드를 출력
df | awk '$2 > 5000 '
df ( 현재 디바이스 정보 ) 명령어를 통해 출력되는 내용 중 두 번째 필드가 5000보다 큰행을 출력
date | awk '{print "Month : $2\n Year"$6}'
date 명령어를 통해 출력되는 두 번째 필드와 여섯번 째 필드를 서로 개행 하여 출력
awk '{print NR, $1, $3|' file
NR(하나의 레코드를 처리한 뒤 1 이 증가하는 변수)을 사용하여 레코드 번호와 함께 파일의 내용대로 출력
awk -F : '/root/{print $0}' /etc/passwd
" : " 구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력
awk -F : '\^[ns]\{print $1}' file
N이나 s로 시작하는 행의 첫 번째 필드를 출력
awk -F '[\t]' '{print $1, $2, $3}' employees
Tab 으로 필드를 구분하며 첫 번째, 두 번째, 세 번째, 필드를 출력한다 (작은 따옴표는 쉘이 대괄호를 해석 할까봐)
awk '$1 ~ /[bB]ill/' employees
~는 특정 레코드나 필드 내에서 일치하는 정규 표현식 패턴이 존재하는지 검사 위해 쓰인다
awk '$1 !~ /ly$' employees
첫 번째 필드가 ly로 끝나지 않는 행들을 출력
awk '$4 ~ /Chin$/{print "The price is $"$8"."}' file
네 번째 필드가 Chin으로 끝나는 문자열 The price is$와 여덟 번째 필드 및 마침표를 함께 출력 한다
SED
기본 형식 : sed 'comman; filename(s)
(p : 출력, d : 삭제, r : 파일로부터 사용자 지정행만 읽음, w : 사용자가 선택한 행을 파일에 저장, -n : 변경된 행만,
a : 내용 추가, i : 내용 삽입)
1 대화형 기능이 없는 편집기
2 쉘 리다이렉션을 이용하여 편집 결과를 저장하기 전 까지는 파일에 아무런 변경도 하지 않는다
3 쉘 스크립트를 작성할 때 유용하다
4 pattern space라는 임시 버퍼를 사용한다
sed '1,2p' file
file의 1행에서 2행까지 출력
sed -n '/root/p' /etc/passwd
기본적으로는 모든 행을 출력, root에 있는게 다시 출력되므로, -n을 통해 기본적으로 출력되는 행을 막는다
sed '3d' file
3번째 행을 삭제하여 출력한다 ( 기본적 출력에서 3개 없애는 것이므로, -n 없어야 됌 )
sed 'bash/d' /etc/passwd
bash를 포함하는 모든 행 삭제하고, 나머지 행들을 출력
sed -n 's/bash/nologin/gp' etc/passwd
bash가 nologin으로 치환되며, -n과 p로 변경된 행만 출력, g로 전역치환
sed -e '5.40d' e 's/root/chgroot/g' /file
-e 옵션이 sed 명령어 하나로 다중 편집을 가능하게 해준다 ( 결과 : 1~4만 출력)
sed '/sexy/r newfile' file
r 명령어는 파일로부터 사용자가 지정한 행을 읽어온다.
newfile 내용은 file에서 패턴을 찾은 곳에 삽입 된다 (file에서 sexy밑에 newfile 삽입)
sed -n '/central/w outfile' file
w 명령어는 사용자가 선택한 행들을 파일에 저장한다 (file에서 central이 있으면 output에 저장된다)
sed /note/a\ > hi' file
a 명령어는 내용을 덧붙일 때, 사용한다 (append)
sed '/note/i\ > woo'file
i 명령어는 삽입 명령어임. 지정한 문장을 매칭되는 행 위에 삽입한다
'OS > 리눅스 & 유닉스' 카테고리의 다른 글
SED 스트림 에디터OS/리눅스 & 유닉스 2012. 1. 4. 22:43SED 스트림 에디터Ken Pizzini최영덕이 문서는 유닉스 표준 유틸리티인 SED의 GNU 확장판 메뉴얼을 번역한 것입니다. 근래에 들어 SED 사용자들이 많이 줄어 드는 추세지만, SED는 간단하고 무식한(!) 치환 작업에는 참으로 유용한 유틸리티입니다. 적당한 SED 문서를 찾아다니다, 결국 못찾고 번역까지 하게되고 말았습니다. 모쪼록 SED가 여러 사용자들에게 편리하게 쓰였으면 하는 바램입니다. 원문에는 [정규표현식 개요] 부분과 [예제 스크립트] 부분이 "나중에 쓰겠다"며 생략되어 있습니다. 처음 UNIX를 접하시는 분들을 위해 제가 임의로 글을 덧붙였음을 말씀드립니다. 처음하는 번역과 SGML 문서 작업이라서 어색한 부분이 많을 것입니다. 고쳐야할 점이나 제가 덧붙인 글의 오류를 지적해주시면 수정하도록 하겠습니다. :)
1. 서론SED는 스트림 에디터입니다. 스트림 에디터는 입력 스트림(파일이나 파이프를 통한 입력)에 대해서 단순한 텍스트 교체가 필요할 때 쓰입니다. SED는 입력물을 딱 한 번에 더 효과적이고 능률적으로 처리해주는 다른 스크립트 편집기(ED와 같은)와 비슷합니다. 하지만 다른 에디터와는 차원이 다른 파이프를 통한 텍스트 필터링이 SED만의 탁월함입니다. 2. 시작SED는 다음과 같은 명령행 옵션을 갖습니다.
'-e', '-f', '--expression', '--file' 옵션이 주어지지 않을 경우에는 명령행 인자들의 옵션이 아닌 첫번째 인자가 처리 명령으로 받아들여집니다. 위의 옵션들이 처리되고 남은 명령행 인수들은 처리될 파일들의 이름으로 해석됩니다. 하이픈(-)은 표준입력스트림을 가리키며, 파일 이름이 주어지지 않았을 때에도 표준 입력 스트림으로 처리 데이타가 들어오는 것으로 간주됩니다. 3. SED 프로그램SED프로그램은 '-e', '-f', '--expression', '--file' 옵션에 기술된 하나 이상의 명령이나 명령집합파일(또는 옵션 이외의 첫번째인자도 포함하여)에 포함된 명령어들의 집합입니다. 이 문서는 그 SED 스크립트(script : 명령이나 명령 집합 파일에 포함된 모든 것들의 순차적 연쇄적 기록)에 대해서 기술할 것입니다. 각각의 SED 스크립트는 주소와 명령어가 한쌍을 이루어 구성됩니다.(주소 혹은 주소공간들은 생략될 수 있으며, 명령어들은 관련된 코드들을 동반할 수 있습니다.) 3.1. SED에서의 행 선택 (행 지정)
주소가 주어지지 않으면 행의 전부가 주소 공간으로 지정됩니다. 하나의 주소가 주어지면 주소와 대응되는 한 행만이 주소 공간으로 지정됩니다. 주소범위는 콤마(,)로 구분된 두 주소를 기술함으로써 지정됩니다. 주소범위는 첫번째 주소 지정부터 시작하여 두번째 주소 지정까지 계속 적용됩니다(전부 지정됨.) 만약 두번째 주소 지정이 정규표현식이라면 첫번째 주소가 적용된 행부터 시작하여 정규 표현식과 대응되는 첫 행까지가 주소공간으로 적용됩니다. 두번째 주소지정이 첫번째 주소지정보다 작거나 같은 크기의 숫자라면 단지 한 행만이 주소공간으로 적용됩니다. 느낌표(!)가 주소 기술의 마지막 문자로 오는 경우에는 적용방식이 반대로 작용합니다. 이말은 만약 느낌표(!) 문자가 주소 범위 기술 뒤에 붙으면 주소 범위와 대응되지 않는 행들만이 지정된다는 것입니다. 낱개의 주소들과 아마도 짖궂겠지만, 빈(Null) 주소에도 적용됩니다. 3.2. 정규표현식 문법 개요'정규표현식'은 SED 뿐만 아니라 UNIX세계에서 가장 중요한 것 중 하나입니다. 하지만 어디까지를 '정규표현식'으로 볼 것인가, 혹은 '정규표준식'의 표준이라는 문제에 대해서는 의견이 분분합니다. '정규표현식'을 사용하는 프로그램마다 표현법이 조금씩 틀릴 뿐만 아니라, '확장 정규표현식'이라는 별종까지 여기저기 등장해 사뭇 혼란스럽습니다. 여기서는 SED에서 쓰이는 '정규표현식'만을 다루겠습니다. SED의 '정규표현식'을 익힌다면, 일단 어디서나 쓸 수있는 '정규표현식'의 mini-set을 익히는 것이 되겠습니다. 좀더 '정규표현식'의 세계를 느끼고 싶은 분들은 나중에 펄 문서등을 참조하시면 될 것입니다. '정규표현식'을 간단히 말한다면, 텍스트 꾸러미에서 원하는 부분만 골라내고자 할 때 사용하는 일종의 집합(set)입니다. 몇개 되지 않으니 주욱 써보도록 하겠습니다.
윗목록에 포함되지 않은 텍스트들은 그냥 텍스트 자체로 해석됩니다. 정규표현식의 몇가지 예를 들어 보겠습니다.
예제에서 보았듯이 '*'문자는 대응 범위를 예측하기 어렵습니다. 정규표현식에서는 '*'문자를 최소화하고, 정확한 실제 문자를 많이 넣어주는 것이 중요합니다. 3.3. SED가 데이타를 버퍼링시키는 곳SED는 활성된 패턴공간(pattern space)과 외부로 확장된 홀드공간(host space)이라는 두개의 데이타 버퍼를 관리합니다. 보통의 처리에서 SED는 입력 스트림으로부터 한 행을 읽어 패턴 공간에 위치시킵니다. 이 패턴 공간은 자료의 조작이 일어나는 공간입니다. 홀드 공간은 텅 빈 채로 초기화되지만 패턴 공간과 홀드 공간 양쪽으로 데이타를 이동시키는 명령어가 존재합니다. 3.4. 자주 쓰이는 명령어들SED를 쓰게 된다면 어떤 경우에도 다음 명령어들이 필요하게 될 것입니다.
3.5. 덜 자주 쓰이는 명령어들물론 이전 장에서 설명한 명령어들보다는 덜 자주 쓰이지만, SED 스크립트에 포함되어 더욱 유용하게 쓰일 수 있는 다음과 같은 명령어들이 있습니다.
3.6. 끈질긴(die-hard) SED프로그래머들을 위한 명령어들대부분의 경우, 아래의 명령어들을 쓰기보다는 펄(PERL)과 같은 다른 프로그래밍언어를 쓰는 편이 더 좋을 것입니다. 하지만 가끔 SED에 늘어붙어 꼼짝못하는 사람이나, 굉장히 복잡한 스크립트를 짜기를 좋아하는 사람도 있기 마련입니다.
4. 몇가지 예제 스크립트들GNU SED 와 함께 배포되는 dc.sed라는 놀라운 스크립트가 있으나, 다음 예제를 한번 보십시요.
5. 행길이 (무)제한에 관해이식성 있는 SED 스크립트를 작성하기를 원하는 이들에게 몇몇 SED 구현에서는 (패턴공간과 홀드공간의) 행 길이가 4000바이트로 제한되어 있음을 알려드립니다. POSIX.2표준에서는 SED 구현이 8192바이트의 행길이를 지원해야 한다고 확실하게 명시하고 있습니다. GNU의 SED는 행길이 제한이 없기 때문에 총 (가상)메모리에 주의만 한다면, 여러분이 입력하는 모든 행들에 대해서 SED가 melloc() 하여 처리할 수 있습니다. 6. SED에 관한 다른 학습자료들SED에 관해 쓰여진 여러책들(본격적인 책들과 쉘프로그래밍에 관해 이야기하는 중에 끼어있는 책이거나)에 덧붙여 SED에 관한 FAQ를 좀더 찾아 보고 싶은 이들은 seders(SED사용자) 메일링 리스트를 다음 사이트에서 볼 수 있습니다(몇몇 책들에 대한 추천을 포함하여.)
비공식 "SED 사용자" 메일링 리스트는 Al Aab씨가 손수 관리하고 있습니다. 구독을 원하시면 af137@tofree.net 으로 당신의 관심사를 적어서 보내주십시요. 'OS > 리눅스 & 유닉스' 카테고리의 다른 글
Bash 스크립팅 가이드OS/리눅스 & 유닉스 2012. 1. 4. 19:03'OS > 리눅스 & 유닉스' 카테고리의 다른 글
유닉스 itoa 구현OS/리눅스 & 유닉스 2011. 12. 30. 15:11'OS > 리눅스 & 유닉스' 카테고리의 다른 글
htonl() htons() ntohl() ntohs()OS/리눅스 & 유닉스 2011. 12. 28. 13:56네트워크 바이트 순서로 변환 unsigned long htonl(unsigned long hostlong);
호스트 바이트 순서로 변환 unsigned long ntohl(unsigned long netlong);
성공시 : 빅 엔디안 또는 리틀 엔디안 방식으로 변환된 값
빅 엔디안 vs 리틀 엔디안
0x1234의 표현방식
리틀엔디안 0x34 0x12 순으로, 우리가 표현하는 것과 반대로 표현됨.
표준은 없고, 시스템마다 차이를 보인다. 현재 사용하는 시스템이 리틀엔디안인지 빅엔디안인지를 가려주는 코드
int endian;
endian = 0x12345678;
printf("Big Endian = 0x12|0x34|0x56|0x78\n"); [출처] htonl() htons() ntohl() ntohs()|작성자 에스이오케이 'OS > 리눅스 & 유닉스' 카테고리의 다른 글
socketpairOS/리눅스 & 유닉스 2011. 12. 27. 19:051장. socketpair(2)연결된 소켓 쌍을 생성한다. 1.1절. 사용법
1.2절. 설명socketpair()은 옵션으로 d영역(domain)을 가지며 protocol프로토콜을 사용하는 type의 소켓 쌍을 생성한다. 생성된 소켓 쌍은 sv를 통해서 넘어온다. 두개의 소켓은 서로 구별할 수 없다. 보통 부모 자식 프로세스간 내부 통신(IPC)를 위해서 사용한다. 소켓이므로 양방향(읽고/쓰기) 통신이 가능하다. 1.4절. 에러
1.5절. 예제
'OS > 리눅스 & 유닉스' 카테고리의 다른 글
파일 디스크립터OS/리눅스 & 유닉스 2011. 12. 27. 16:59파일 디스크립터 프로그래밍을 한다면 당연히 파일디스크립터를 모르면 안되겠죠. |
htonl() htons() ntohl() ntohs() (0) | 2011.12.28 |
---|---|
socketpair (0) | 2011.12.27 |
perror (0) | 2011.12.23 |
write (0) | 2011.12.23 |
read (0) | 2011.12.23 |
시스템 에러 메시지를 출력한다.
perror() 함수는 표준 에러메시지를 화면에 출력(표준출력) 시켜준다. 출력되는 에러 메시지는 시스템콜 혹은 라이브러리 함수를 호출하면서 발생한 마지막 에러에 대한 설명을 나타낸다.
아규먼트로 주어지는 s 는 사용자가 먼저 출력시켜줄 사용자정의 메시지 이며, colon(":") 이 붙은후에 표준에러 메시지가 출력된다. 표준에러 메시지의 마지막에는 자동적으로 개행 처리('\n')을 하게 된다. s 는 주로 디버깅용도로 주로 사용되는데, 해당 코드를 포함하는 함수이름 등을 적는다.
#include <unistd.h> #include <stdio.h> int main(int argc, char **argv) { if (access(argv[1], F_OK) != 0) perror("파일이 존재하지 않음"); else printf("파일 존재함\n"); } |
[root@localhost test]# ./access hee 파일이 존재하지 않음 : No such file or directory |
파일기술자가 가리키는 파일에 쓴다. 이 파일기술자는 open(2), socket(2) 등으로 얻을수 있다.
첫번째 아규먼트인 fd 는 열린파일 기술자이다. 이것은 보통 open(2), socket(2) 등으로 만들어지며, 때때로 pipe(2) 등으로 만들어지기도 한다.
두번째 아규먼트는 fd 로 쓸 데이타이며, count 는 fd 쓸 데이타의 크기이다.
성공할경우 쓰여진 바이트 만큼이 리턴된다. 0이면 쓰여진것이 없음을 나타내며, -1 일경우는 에러가 발생했을 경우이다. 에러가 발생했을경우에는 errno 에 적당한 값이 설정된다.
다양한 원인에 의해서 에러가 발생할수 있으며 아래와 같은 에러 메시지들이 있다.
fd 가 유효한 파일 기술자가 아니거나 쓰여질수 없도록 열려있을경우
fd 가 쓰기에 적당하지 않은 객체와 연결되어 있을경우
buf 가 접근할 수 없는 주소 공간을 가리키고 있을때
fd 가 끝이 닫혀진 소켓이나 파이프에 연결되어 있을때. 쓰고 있는 프로세스가 SIGPIPE signal를 받았을때 발생한다.
fd 가 비봉쇄(O_NONBLOCK) 로 열렸을경우, 데이터를 쓰기 위해 fd 와 연결된 파이프나 소켓에 공간이 없을때, 발생한다. 봉쇄로 열렸을경우에는 연결된 파이프나 소켓에 공간이 있을때까지 봉쇄된다.
fd 가 비봉쇄(O_NONBLOCK) 로 열렸을경우, 데이터를 쓰기 위해 fd 와 연결된 파이프나 소켓에 공간이 없을때, 발생한다. 봉쇄로 열렸을경우에는 연결된 파이프나 소켓에 공간이 있을때까지 봉쇄된다.
#include <fcntl.h> #include <unistd.h> #include <stdio.h> struct data { int age; char name[25]; }; int main() { int fd; int n; struct data mydata, readdata; fd = open("data.txt", O_CREAT|O_RDWR); if (fd == -1) { perror("open error : "); } mydata.age = 25; strcpy(mydata.name, "hello"); n = write(fd, (void *)&mydata, sizeof(mydata)); close(fd); } |
열린 파일기술자로 부터 데이타를 읽어들인다.
socket(2) 혹은 open(2) 등으로 열린 파일에서 원하는 데이타를 읽어들인다. fd 가 socket, open 으로 열린 파일기술자이다. fd 에 읽을 데이타가 있다면 buf 에 담아서 가져온다. count 는 buf 에서 한번에 가져올 데이타의 크기를 나타낸다.
성공할경우 0이상의 값을 반환한다. 0이라면 파일의 끝을 의미하며, 0 보다 큰 양수라면 이는 읽어들인 buf 의 크기를 나타낸다. 파일 끝이 아닌상태에서 파일에서 데이타를 가져오는데 성공했다면, 파일 포인터의 위치는 읽은 데이타의 크기만큼 이동하게 된다.
에러가 발생할경우 -1 을 되돌려주며 errno 는 적당한 값으로 설정된다. 에러가 발생했을경우 파일 포인터의 위치가 어떻게 바뀔지는 예측할수 없다.
perror (0) | 2011.12.23 |
---|---|
write (0) | 2011.12.23 |
open (0) | 2011.12.23 |
fcntl 을 이용한 파일제어 (0) | 2011.12.23 |
mktime 날짜를 Unix Time으로 전환 (0) | 2011.12.08 |