> * $ls -al을 하면 퍼미션을 나타내는 10 자리의 기호를 볼 수 있는데 제일 처음 있는 기호는 해당 파일의 종류를 나타내는 기호이고 나머지 기호들은 3개씩 묶음 기준으로 왼쪽부터 user의 퍼미션, group에대한 퍼미션, 해당 파일의 user가 아니며 group에 속해 있지 않은 사람에 대한 퍼미션을 나타낸다.
> * 위에서 말한 3개의 묶음 기호에는 rwx가 있으며 r은 read를 뜻하고 w는 write를 뜻하고 x는 실행을 뜻한다.
> * 퍼미션은 $chmod ### 명령어로 바꿀수 있으며 ### 대신에 세 자리에 들어가야 할 것은 순서대로 user, group, 제 3자에 주고 싶은 퍼미션에 관한 숫자를 적으면 된다.
> * 위의 $chmod 명령어에 적는 숫자의 종류로는 4, 2, 1와 이 숫자들의 합이 있으며 read는 4로 표현 write는 2로 표현, 실행은 1로 표현한다. 따라서 예를 들어 모든 것을 다 허용 하고 싶다면 4+2+1 = 7 로 퍼미션을 조정하면 된다.
3. $whoami 명령어 사용
> * $whoami : 지금 사용중인 유저네임이 출력된다.
> * $whoami > pcc022 : pcc022란 파일을 생성 후 whoami 명령시 출력될 내용 즉, 지금 사용중인 유저네임이 pcc022란 파일에 저장된다.
> * $whoami >> output : 리디렉션에서 > 가 아닌 >> 를 사용시 output이란 파일에 덮어 쓰지 않고 내용을 추가하게 된다.
4. $groups 명령어 사용
> * $groups : 내가 속해있는 그룹을 확인하여 출력시켜준다.
5. $wc 명령어 사용
> * $wc : word count의 약자로 어떠한 것에 대해 단어 개수를 세어준다.
## lesson02
1. 퍼미션에서 제일 앞에 기호
> * 퍼미션에서 제일 앞의 기호는 종류를 나타낸다.
> * 여러 종류가 있는데 그 중 4가지만 보면 아래와 같다.
>> 1. l : simbolick link
>> 2. d : directory
>> 3. c : character 디바이스
>> 4. b : block 디바이스
2. 메세지 보내기
> * $wall ## 명령어는 모든사람에게 ##이란 메시지를 보낼 수 있게 해준다.
> * $write name ## 명령어는 name이란 사람에게 ##이란 메세지를 보내준다.
> * $mesg n : 나에게 오는 메세지를 받지 않을 수 있도록 해준다.
3. $man 명령어 사용
> * $man 명령어는 어떤것에 대한 메뉴얼 확인을 할 때에 사용한다.
4. $ps 명령어 사용
> * $ps : 실행중인 프로세스들을 출력해준다.
5. 여러 파일들 위치
> * /var/log tail -200 auth.log 로 이동하여 .log파일을 살펴보면 root에 로그인을 시도했다 등의 기록들을 볼 수 있다.
> * /usr/include 안에 들어가면 우리가 c언어에서 include 하는 것들을 상세히 볼 수 있다. (예를 들어 stdio.h 등이 있다.)
6. vi editor 사용 팁
> * 줄의 number를 보고 싶을 때에는
" :set number "를 해주면 된다.
> * 특정 키워드를 찾고 싶을 때에는 " :/ ### " 으로 ###이란 키워드는 찾을 수 있다.
7. input, output 스트림
> * input, output 스트림은 버퍼로 이해하면 된다.
> * stdin, stdout, stderr 각각은 디바이스 이다.
8. 실행파일 생성하기
>> 1. 먼저 .c파일을 생성해야 하는데 아래와 같은 코드의 hello.c 파일을 생성했다고 하자
```c
#include<stdio.h>
intmain()
{
FILE*fout;
fout=fopen("output.txt","w");
fprintf(fout,"Hello World\n");
fclose(fout);
}
```
>> * 이 때 c 파일 생성시 file을 open하여 사용하고 마지막에는 꼭 fclose로 파일을 닫아 주어야 한다.
>> 2. 생성한 hello.c파일을 $cc hello.c 와 같이 cc명령을 이용하여 컴파일 한다.
>> 3. ./a.out 을 통해 생성한 실행파일을 실행시킨다.
> + 위에서 생성한 hello.c파일을 더 많이 쓰이는 방법으로 다시 생성한 코드는 아래와 같다.
```c
#include<stdio.h>
intmain()
{
intin_a;
fscanf(stdin,"%d",&in_a);
fprintf(stdout,"Hello stdout %d\n",in_a);
fprintf(stdout,"Hello stderr %d\n",in_a);
}
```
> * 위와 같은 방식으로 코드는 일반적으로 더 많이 쓰이는 코드이며 stdout과 stderr이 구분되어 있는 것을 볼 수 있다.
9. 다양한 리디렉션 사용법
>1. 0< or < : stdin 을 나타내는 리디렉션
>2. 1> or > : stdout 을 나타내는 리디렉션
>3. 2> : stderr를 내보내는 리디렉션
>4. \>> : 내용을 추가하는 리디렉션 (위의 세개는 내용을 덮어쓰지만 해당 리디렉션은 내용을 덮어쓰지 않고 추가한다.)
> * 예를 들어 $./a.out < in.txt > out.txt 2> err.txt 를 하게 되면 ./a.out의 input으로 in.txt란 파일을 넣고 out.txt에 stdout출력물을 저장시키고, err.txt에 stderr를 저장시키게 된다.
> * mort명령어를 사용하여 $more in.txt out.txt err.txt 로 세 개의 txt파일을 살펴보면 ./a.out에 input으로 전달된 내용과 stdout, stderr의 출력물들을 각각 하나씩 잘 보여준다.
10. sleep 명령어를 사용하여 메세지 보내기
> * $sleep 100; echo "message" : 100초 후에 메시지를 보낸다.
> * $kill %1 %2 를 하면 처음 명령과 두 번째 명령 즉, sleep 100이란 명령과 echo "message"란 명령 둘 다 종료시켜준다.
11. date 명령어
> * $date 명령어는 날짜는 출력해준다.
## lesson03
1. 여러가지 알아두어야 할 사항들
> * ./a.out을 a.out으로 바로 실행 가능하게 하려면 Path에 .을 추가하면 된다. 하지만 .을 추가하면 보완상 좋지 않아진다.
> * binary 파일은 git에 저장하지 않는 것이 좋다. 따라서 .out 파일들을 git에 올리지 않게 하지 위해 자동으로 걸러주는 .gitignore파일을 생성해야 한다. .gitignore 파일에 *.out을 추가하여 git에 올라가는 것을 방지 할 수 있다.
> * .으로 시작하는 파일은 hidden파일이라서 안보이는 파일이므로 $ls시에는 보이지 않고, $ls -al을 해야 볼 수 있다.
> * $file name : name이란 파일에 대해 앞의 명령어 시에 해당 출력물이 ASCII로 나타난다면 한글이 한글자도 없다는 것이다. (UTF-8 : unicode : 한글 등을 표현가능)
2. 컴퓨터의 구성 요소
> 1. user
> 2. software
> 3. hardware
> 4. data
3. terminal 이란
> * terminal 이란 한글로 해석하면 단말(기)에 가깝다. 사용자 바로 앞에 붙어 있는 컴퓨터 장치로 볼 수 있다.
4. computer hardware system
> * 컴퓨터 하드웨어 시스템에는 크게 다섯가지로 구분된다.
>> 1. memory
>>> * Memory는 중심에 위치하여 memory를 거쳐야지만 다른 하드웨어 시스템들이 서로 소통이 가능 하다.
>> 2. input Devices
>>> * stdin과 같은 것들은 memory에 있는 io버퍼에 전달된다. 다른 곳으로는 전달 될 수 없다.
>> 3. output Devices
>>> * stdout과 같은 것들을 받는 곳으로 memory에 있는 버퍼에서 input devices에서 전달 받은 것을 이곳으로 전달 해 줄 수 있다.
>> 4. CPU
>>> * inter, ARM 과 같은 것들이 있다.
>>> * CPU는 memory를 통해서만 다른 하드웨어 시스템과 데이터를 주고 받을 수 있다. 즉, cpu에서 직접적으로 storage devices에 접근할 수 없다.
>> 5. storage Devices (=Disk)
>>> * HDD, SSD와 같은 것이 있다.
>>> * storage devices또한 cpu와 같이 memory와만 직접적인 소통이 가능하다.
5. git 서버 접속 원리
> * git.ajou.ac.kr 은 http 로 접속하는 것이다. (인터넷에서 접속)
> * 팔달관에 있는 git.ajou.ac.kr에서 ssh로 로그인을 하게 되면 SSH로 접속하는 것이며 터미널을 임시로 부여해 주어 사용가능하게 한다.
> 3. $git pull : 사이트에서 수정을 추가로 한 경우 해당 디렉토리와 내용이 다를 수 있으므로 $git pull 을 통하여 해당 디렉토리의 내용을 사이트와 맞춰 업데이트 시켜준다.
> 4. $git add * : *는 와일드 카드로 모든 파일에 대한 것을 지칭하며 git add를 통해 로컬에서 수정한 것들을 http서버에 있는 내 계정에 업데이트 시키기 위해 스테이지에 올려준다.
> 5. $git commit -m " 메세지내용" : add를 통해 stage에 올린 파일들을 push하기 전 커밋해준다. -m 은 메세지를 쓸 수 있게 해주는 옵션이다.
> 6. $git push : git push 를 통하여 커밋한 모든 내용들을 서버에 올려준다.
7. PIPE
> * 파이프란 기호 | 로 나타내며 입력받은 결과를 다른 곳으로 보내주는 역할을 한다.
>>> 예를 들어 $who | wc 를 하게 되면 who명령어의 결과를 wc의 input으로 보내준다.
> * $mkfifo mypipe
>>> 해당 명령어는 파이프를 생성해주는 명령어로 $ls -al시에 mypipe란 파일의 속성이 "p"로 나타나는 것을 확인 할 수 있다. (p는 pipe를 나타내는 약자)
> * T-joint : "ㅜ" 자 모양으로 생긴 파이프를 T-joint 파이프라고 부르는데 모양에서 볼 수 있듯이 그저 물이 흐르는 일자 모양의 파이프가 아닌 한 갈래의 길이 중간에 더 생긴 형태의 파이프 이다.
>> * T-join pipe를 생성하는 명령어는 "tee"이다.
>>>> (ex) $ls -l | tee aaa 를 하면 ls -l의 출력물들이 input이 되어 흘러가는 도중 tee aaa란 명령어 때문에 한 갈래의 길이 생겨 aaa란 파일이 생성되어 출력물들을 저장시키고 원래의 파이프가 하는 일처럼 다시 마저 흘러가 출력물을 보여주게 된다.