본문 바로가기
리눅스

리눅스 수업 7차시

by IT매니절 2024. 3. 16.

복습
find -mtime 0
=> 오늘 만든 파일이 없으면 결과 없음

touch a.txt
find -mtime 0 -ls
=> 출력
34106522    0 drwx------   3 user1    user1         116  3월 16 09:37 .
34106526    0 -rwsrwxrwx   1 user1    user1           0  3월 16 09:33 ./a.txt

a.txt뿐만 아니라 현재 디렉터리(.)의 시간도 변경되어 검색결과로 출력됨
a time, m time, c time 전부 변경됨
(파일을 만들기 위해 access, 디렉터리 내용물이 변경되어 modify, file-size가 바뀌어 change)

디렉터리는 파일명과 i-node num의 정보를 갖고 있다.

 

POSIX
Portable Operating System InterFace for Unix
이식성이 높은 유닉스 응용 프로그램을 개발하기 위해 IEEE가 책정한 인터페이스 규격

 

echo $$
=> bash의 프로세스 번호 출력

ls -l /proc/프로세스 pid/fd

=> 출력

lrwx------. 1 user1 user1 64  3월 16 09:31 0 -> /dev/pts/1
lrwx------. 1 user1 user1 64  3월 16 09:31 1 -> /dev/pts/1
lrwx------. 1 user1 user1 64  3월 16 09:31 2 -> /dev/pts/1
lrwx------. 1 user1 user1 64  3월 16 09:35 255 -> /dev/pts/1

파일 디스크립터 0, 1, 2 심볼릭링크 된 폴더 확인

 

리눅스
c언어, 어셈블리어, 6.1부터 Rust 언어 혼합

c/c++의 메모리 관리 취약점을 보완한 Rust

 

file fdtest
fdtest: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=a1465c490dfeb0b793b70eee499b045c89cd7dc7, not stripped
=> ELF 64-bit LSB executable : 64비트 실행파일, dynamically linked : 동적링크

 

vi의 확장판인 vim 예쁘게(컬러풀하게?) 사용하기
- vim 설치
- /etc/vimrc 마지막에 설정 추가
set nu
set bg=dark
set ai
set ci
set sw=4
set ts=4
set cursorline
set expandtab )
- $HOME/.bashrc 파일에 Alias vi='vim' 추가
- source .bashrc 명령어로 나의 홈 디렉터리 설정 리로드

 

/* */ 주석이 있는 소스코드를 붙여넣기 할 때, 소스가 꼬일 수 있다
이럴 때는 vi로 파일 연 다음에 :set noai :set paste
설정해준 뒤 붙여넣기 하면 깨지지 않는다

 

PIPE 파이프
IPC(Inter Porcess Communication) 여러 프로세스간에 데이터를 전달하는 기법
기호 | 언네임프 파이프
Process1 | Process2

ex
cat /test.txt | grep abc
/test.txt의 내용 중에 abc를 검색하여 출력해준다
왼쪽 프로세스의 출력결과를 오른쪽 프로세스의 입력으로 연결한다
(pid 1번의 1번(표준출력) -> pid 2번의 0번(표준입력))

 

sleep 100 | sleep 200 &
ll /proc/[pid number]/fd
ll /proc/7989/fd                       <- sleep 100
합계 0 
lrwx------. 1 root root 64  3월 16 10:51 0 -> /dev/pts/0
l-wx------. 1 root root 64  3월 16 10:51 1 -> pipe:[47463]
lrwx------. 1 root root 64  3월 16 10:51 2 -> /dev/pts/0
ll /proc/7990/fd                        <- sleep 200
합계 0
lr-x------. 1 root root 64  3월 16 10:51 0 -> pipe:[47463]
lrwx------. 1 root root 64  3월 16 10:51 1 -> /dev/pts/0
lrwx------. 1 root root 64  3월 16 10:51 2 -> /dev/pts/0

sleep 100의 표준출력(1) => pipe:[47463] => sleep 200의 표준입력(0)

pipe로 두 명령어가 연결된 것을 확인할 수 있다

(파이프 리다이렉션)

 

cat /etc/passwd | grep ^root
=> /etc/passwd 중에서 grep으로 root로 시작하는 줄 보기

^(캐럿) : 줄의 시작을 나타낸다

 

Redirection리다이렉션
입력, 출력 스트림의 방향을 재지향할 때 사용한다

>, >> 출력 리다이렉션
<, << 입력 리다이렉션

사용법
> file : 표출출력을 파일로 재지향. 없으면 새로 만들고 있으면 덮어쓴다 (= 1>file)
>> file : 표출출력을 파일로 재지향. 없으면 새로 만들고 있으면 파일의 끝에 추가한다 (= 1>>file)
< file : 파일로부터 표준 입력을 재지향
2>file : 표준에러(2)를 파일로 재지향
2>&1 : 표준에러(2)를 표준출력(1)로 재지향

 

sleep 100 &
sleep 200 > /dev/null &
ll /proc/8579/fd                          <- sleep 100 &
합계 0
lrwx------. 1 root root 64  3월 16 11:03 0 -> /dev/pts/0
lrwx------. 1 root root 64  3월 16 11:03 1 -> /dev/pts/0
lrwx------. 1 root root 64  3월 16 11:03 2 -> /dev/pts/0
ll /proc/8583/fd                          <- sleep 200 > /dev/null &
합계 0
lrwx------. 1 root root 64  3월 16 11:03 0 -> /dev/pts/0
l-wx------. 1 root root 64  3월 16 11:03 1 -> /dev/null
lrwx------. 1 root root 64  3월 16 11:03 2 -> /dev/pts/0

(명령어 한줄로 출력하기 ll /proc/{8579, 8583}/fd )

=> 표준출력(1)이 /dev/null로 연결된 것을 확인할 수 있다

 

sleep 200 > /dev/null 2>&1 &

ll /proc/9073/fd
lrwx------. 1 root root 64  3월 16 11:13 0 -> /dev/pts/0
l-wx------. 1 root root 64  3월 16 11:13 1 -> /dev/null
l-wx------. 1 root root 64  3월 16 11:13 2 -> /dev/null

=> 표준출력(1)을 /dev/null로 보내는데, 표준에러(2)도 1을 보낸 곳으로 보낸다

=> 표준출력(1)과 표준에러(2)가 둘 다 /dev/null로 향해있는 것을 확인

 

echo "abcdef" > a.txt

echo "abcdef" >> a.txt

=> a.txt에 덮어쓰기

=> a.txt의 마지막 내용에 추가하기

 

sleep 20000 << EOF
> abcd
> aaa
> EOF
ps aux | grep sleep 로 pid 확인
ll /proc/9429/fd
합계 0
lr-x------. 1 root root 64  3월 16 11:20 0 -> /tmp/sh-thd-1710587385 (deleted)
lrwx------. 1 root root 64  3월 16 11:20 1 -> /dev/pts/0
lrwx------. 1 root root 64  3월 16 11:20 2 -> /dev/pts/0

cat << EOF
> 안녕하세요 ㅋ
> EOF
=> 스크린에 출력
안녕하세요 ㅋ


cat << EOF > aeof.txt
> 안녕하세요 ㅋ
> EOF
=> 출력이 aeof.txt 파일로 저장됨

 

for문을 활용한 리다이렉션
for i in 1 2 3 4 5
> do
>   echo $i
> done
1
2
3
4
5

=> 그대로 출력

 

echo 1111 2> /dev/null
1111
=> 2는 표준에러(2)이므로, 표준출력(1)은 그대로 출력됨

 

사용 예시

find / -perm -4777

find: ‘/proc/10007/fdinfo/5’: 그런 파일이나 디렉터리가 없습니다
/home/user1/a.txt
/home/user1/test

=> 에러 출력이 그대로 나온다

find / -perm -4777 2> /dev/null
/home/user1/a.txt
/home/user1/test

=> 에러 출력을 버리고 정상결과만 출력

 

c언어 소스코드에서의 활용

#include <stdio.h>
int main(int argc, char **argv){
    if(argc != 2){             //argc는 입력인자의 개수를 말한다.
                              //첫번째 인자는 파일의 이름이므로, 1개 이상의 입력이 주어져야 한다.
     //printf("Usage : %s, message \n", argv[0]);
     fprintf(stderr, "Usage : %s, message \n", argv[0]);
     return 1;
    }
    //printf("message \n", argv[1]);
    fprintf(stderr, "message \n", argv[1]);
	return 0;
}

=> printf는 정상출력(표준출력 1)만 출력함.

스트림을 지정해 줄 수 있는 함수인 fprintf를 써서 비정상 에러(표준에러 2)를 출력할 수 있다.

(stdin 표준입력, stdout 표준출력, stderr 표준에러

printf는 버퍼를 통해 출력하고, fprintf는 버퍼없이 바로 출력한다)

 

gcc로 컴파일 한 후 테스트

./test 2> /dev/null

printf 버전 : Usage : ./ccc2, message

fprintf 버전 : 출력없음

=> 표준에러(2)를 /dev/null로 보냈으므로, 스크린 출력이 없어야 맞는데,

스트림을 인식하지 못하는 printf는 그대로 출력해버림

 

 

vi 편집기

- 명령모드
- 입력모드
- ex모드(콜론)

 

처음 vi로 파일을 열면, 명령모드로 시작한다.

 

모드변환
명령모드 -> 입력모드 : i, a, o, I, A, O
입력모드 -> 명령모드 : ESC
명령모드 -> ex모드 : 콜론(:)

 

옵션

+ : 가장 마지막줄로 연다 ( vi filename + )


단축키
:q 종료
:q! 저장없이 종료 (파일이 수정되면 :q로 빠져나갈 수 없으므로, 강제로 빠져나가야 함)
:wq 저장후 종료

:wq! 강제 저장후 종료
:w! 읽기전용도 강제저장
:w filename 저장(filename으로)
:w >> filename (filename에)덧붙여서 저장
:e filename 열기

 

cp /etc/DIR_COLORS .
=> 연습용 파일 현재 위치로 복사해오기

 

입력모드 단축키

a : 커서 위치의 다음 칸부터
A : 커서 행의 맨 마지막부터
i : 커서 위치부터
I : 커서 행의 맨 처음부터
o : 커서 행의 다음 행부터
O : 커서 행의 이전 행부터
s : 커서 위치의 한글자를 지우고 입력
cc : 커서 위치의 한 행을 지우고 입력

 

이동 단축키

h j k l
=> h왼쪽 j아래 k위 l오른쪽

H 커서를 현재 화면의 맨 위로 [n]H 커서를 현재 화면의 위에서 [n]행으로 이동
M 현재 화면의 가운데로
L 현재 화면의 마지막으로 [n]L 커서를 현재 화면의 아래에서 [n]행으로 이동

gg 문서의 첫번째행으로
G 문서의 마지막행으로
zz 커서가 위치한 행을, 화면의 중앙으로 옮겨옴

 

삭제 관련키
d + 이동키 : 이동키만큼 삭제
ex d + dd : 커서가 있는 행을 삭제함
ex d + j : 커서가 있는 행 + 그 다음행을 삭제함
ex d + k : 커서가 있는 행 + 그 이전행을 삭제함
d$ : 커서 위치부터 현재 행의 끝까지 삭제

복사&붙여넣기
yy : 커서가 있는 줄 복사
y + 이동키 : 이동키만큼 복사
v : 글자단위 블럭
V : 줄단위 블럭
Ctrl + v : 세로 블럭
p : 커서 다음에 붙여넣기
P : 커서 이전에 붙여넣기

기타
u : 되돌리기 (윈도우의 ctrl + z)
ctrl + R : 지워진 것을 복구함

~ 대소문자 전환
< 앞의 Tab(공백) 제거 (블럭이 없으면 << )
> 앞에 Tab(공백) 산입 (블럭이 없으면 >> )
J 행 합치기

:set mouse=a 마우스 사용모드
:! 명령어 명령어 실행

:r filename
ex :r ./a.txt
./a.txt의 내용을 현재 커서에 붙임
:r !pwd
pwd의 실행결과를 커서를 붙임

 

*
dd : 한줄 삭제
cc : 한줄 삭제 후 입력
yy : 한줄 복사
gg : 1번 라인으로
G : 마지막 라인으로

:reg
=> vi의 레지스터(윈도우의 클립보드와 같은 역할) 목록을 볼 수 있다 

 

문자열 찾기
/[찾는 단어] : 아래로 가면서 문자열 찾기 (문서 전체)
?[찾는 문자열] : 위로 가면서 문자열 찾기  (문서 전체)

f [찾는단어]
n : 다음 문자열
N : 이전 문자열

문자열 찾기의 결과는 하이라이팅되어 나타나는데,

ex TERM putty
 46 TERM putty-256color

문서를 종료해도 하이라이팅이 유지되므로, 하이라이팅을 없애려면

/없는단어찾기 또는 :noh (= :nohlsearch) 입력

 

중요 단축키

ctrl + z : 프로세스 종료후 스크린(포그라운드)으로 이동. 진행중 프로세스는 Suspend된다

=> fg 명령어를 이용해 suspend된 프로세스를 포그라운드 프로세스로 실행하여 복원

ctrl + c : 프로세스 중지

ctrl + s : 터미널 잠금

ctrl + q : 터미널 잠금 해제

 

리눅스 프로그래밍(c언어)을 하다보면 vi가 매우 유용하다

'리눅스' 카테고리의 다른 글

리눅스 수업 2 1차시  (0) 2024.04.06
리눅스 수업 8차시  (0) 2024.03.17
리눅스 수업 6차시 (셀프실습)  (0) 2024.03.14
리눅스 수업 5차시  (0) 2024.03.09
리눅스 수업 4차시  (0) 2024.03.03