diff --git a/README.md b/README.md index 1863a4f43dbb74b155a53809d8722226881ecb86..b8088d82da8eaa44dd2b32ec8ae6fb52e367ff86 100644 --- a/README.md +++ b/README.md @@ -163,3 +163,98 @@ int main() > * T-joint : "ㅜ" 자 모양으로 생긴 파이프를 T-joint 파이프라고 부르는데 모양에서 볼 수 있듯이 그저 물이 흐르는 일자 모양의 파이프가 아닌 한 갈래의 길이 중간에 더 생긴 형태의 파이프 이다. >> * T-join pipe를 생성하는 명령어는 "tee"이다. >>>> (ex) $ls -l | tee aaa 를 하면 ls -l의 출력물들이 input이 되어 흘러가는 도중 tee aaa란 명령어 때문에 한 갈래의 길이 생겨 aaa란 파일이 생성되어 출력물들을 저장시키고 원래의 파이프가 하는 일처럼 다시 마저 흘러가 출력물을 보여주게 된다. + + +## lesson04 + +1. 리디렉션 +> 1. <<< 리디렉션 +>> * 해당 리디렉션은 파일의 입력값을 바로 넣어주어 실행시키는 역할을 한다. 하지만 bash에서만 실행이 가능한 리디렉션이다. +>> * (ex) $a.out <<< 99 : 99를 a.out의 입력값으로 넣음 +> 2. 여러가지 리디렉션 +>> * $ >&2 : stdout을 stderr로 보내는 리디렉션 +>> * $read -r line < file : file을 stdin 대신 집어넣을 때 사용하는 리디렉션 +>> * 2>&1 은 & > 와 같으며 이 두 리디렉션은 stderr을 stdout에다 내보내는 것이다. +>> * $mycomm >> outfile 2>&1 명령과 $mycomm &>> outfile 명령은 같은 동작을 하며 mycomm 에서 나온 것을 outfile에 누적시키고 stderr를 stdout에 copy 뜨게 한다. + +2. $cat 명령어 와 bash에서만 사용 가능한 리디렉션 +> 1. $cat 명령어 +> * 기본 $cat 명령어는 입력받을 때 마다 출력하며 소스등을 보여주는 역할을 한다. +> 2. $cat << ### 명령어 +> * enter를 쳐도 계속 입력을 받다가 ### 입력시 한꺼번에 출력을 시켜줌 즉, 한꺼번에 입력을 받음 +> * (ex) $cat << QQQ : QQQ가 입력될 때 까지 입력을 받는다. + +3. 와일드카드(globbing) +> * 와일드카드는 ? 와 * 두 가지 종류가 있다. +> 1. "?" 와일드 카드 +>> * 특정문자대신 ?로 표시할 수 있다. 글자수에 비례하게 ?를 넣어 사용한다. +>> * (ex) abc.? : abc라는 모든 확장자 파일을 뜻함 +>> * (ex) a?? : a로 시작하는 세 글자 파일을 뜻함 +> 2. "*" 와일드 카드 +>> * "*"는 모든 것을 가르킨다. "?"와 달리 글자수와 비례하지 않고 하나의 "*"만 써도 여러 글자를 표현 할 수 있다. +>> * (ex) h* : h로 시작하는 모든 파일 (길이 상관 없음) +>> * (ex) * : 존재하는 모든 파일 + +4. -o 옵션을 이용한 컴파일 +> * $cc 명령어에서 -o명령어를 사용하면 a.out가 아닌 다른 이름으로 실행파일을 생성 할 수 있다. +> * (ex) $cc -o b.out hello.c : hello.c파일의 실행파일을 b.out이란 이름으로 생성함 + +5. pipe +> * pipe나 soket으로 통신을 한다. +> * standard IO stream +>> 1. o< : stdin 을 뜻하며 memory와 소통시 stdin buffer이용 +>> 2. 1> : stdout 을 뜻하여 memory와 소통시 stdout buffer 이용 +>> 3. 2> : stderr 을 뜻하여 memory와 소통시 stderr buffer 이용 +>> * 이때 0, 1, 2 등의 번호를 user가 /dev 아래에 있는 stdin, stdout, stderr 에서 마음대로 define 하여 사용할 수 있다. + +> * cmd1 | cmd2 : cmd1의 stdout이 cmd2의 stdin으로 들어간다. 이때 cmd1 와 cmd2는 동시에 병렬적으로 실행되야만 한다. +> * 만약 stdin이 준비가 되지 않았는데 stdout이 막 쏟아낸다면 block된다. 즉, cmd1이 cmd2보다 빠르면 파이프의 write는 블록되고 더 이상 진행되지 않는다. +> * 만약 cmd2이 cmd1보다 빠르면 파이프로부터의 read는 block된다. cmd2가 먼저 종료하면 파이프는 close 되고 cmd1은 다음번 write에 SIGPIPE 신호를 받게 되어서 종료한다. +> * 따라서 파이프시에 두 명령어는 무조건 동시에 실행되어야 한다. +> * named pipe : mkfifo 명령으로 파일처럼 생성된다. + +6. C언어에서의 변수 타입 +> * int 는 정수가 아닌 정수형(type) 이다. 무한대와 -무한대와 가까운 큰 수는 표현할 수 없다. 따라서 아래의 코드는 그저 더한값을 반환해주는 것 뿐만 아니라 두 수의 합이 type size를 넘었는지 안넘었는지 확인시켜 주는 역할 또한 한다. +``` C +int ifuncAdd(int a, int b) +{ + return a+b; +} +``` +> * type의 한계는 $cd /usr/include/vi limits.h 에서 확인하면 된다. + +> * c언어에서는 음수를 표현하기 위해 one's complement, two's complement, sign and magnitade 를 사용한다. +> * 또한 여러 변수형을 signed 와 unsigned로 표현할 수 있으며 signed는 모든 부호를 표현 가능하고, unsigned는 양수만 표현함으로써 음수를 표현했던 크기만큼 양수의 더 많은 크기를 표현가능하게 한다. 일반적으로 unsigned라고 선언하지 않으면 자동으로 signed가 선언된다. + +> * 아래는 32bit짜리를 이진수로 변환하는 프로그램인 binary.c 파일의 코드이다. +```C +#include <stdio.h> +int main() +{ + int i; + int in_a; + fscanf(stdin, "%d",&in_a); + for(i=31; i>=0; i--) + { + fprintf(stdout, "%d", ((in_a>>i) & 1)); + } +} +``` +>> 위에서 오른쪽 shift 리디렉션 >>i 를 이용함으로 in_a를 나누기 2^i한 결과의 몫을 나타내는 것과 같은 효과를 준다. +>> * 오른쪽 shift : >>n == /2^n + +>> 이진수를 표현할 때 제일 앞의 수가 0 이면 signed 이고 1이면 unsigned이다. 또한 1로 시작하는 경우에는 2의 보수 를 사용하여 표현한다. + +>> 따라서 unsigned를 이진수에서 십진수로 바꿀 때의 예를 살펴보면 111101 = -(000010)-1 = -3_(10) 이다. + +> * 1000 0000(2) = -128(10) +> * 1100 0000(2) = -64(10) +> * 1110 0000(2) = -32(10) + +* & (and operation)이용시 and 연산과 같은 값을 도출한다. (0&0=0, 0&1=0, 1&1=1) + +* 오른쪽 shift 한 번시에 왼쪽칸이 한 칸씩 비게 되는데 이때 생긴 빈칸에는 +>> * unsigned일때에는 1을 채우고 +>> * signed일때에는 0을 채운다. +* 따라서 변수 선언 타입이 signed인지, unsigned 인지에 따라 같은 값도 다르게 출력된다. +