Linux - 시그널 Signal (Ctrl+c, Ctrl+z)

Posted by ironmask84
2018. 5. 13. 00:39 나는 프로그래머다!/Linux



리눅스에서 Ctrl + C 키 조합을 통해 프로세스 종료를 많이 해보셨을 겁니다.

저 또한 그냥 개발시에 테스트 진행하다가 빨리 강제종료 시키기 위해 사용을 해왔었습니다.

그러다가 Ctrl + C가 먹히지 않는 프로세스가 발생하고는...

Ctrl + Z 를 어디선가 써본적이 있어! 라는 생각이 스쳐지나가면서 써보니 

뭔가 다시 콘솔창에 프롬프트가 상태가 되어 명령어 입력이 가능해집니다.

뭔가 근데 찜찜하기 시작합니다. 

알고 보니 이건 foreground process를 background로 전환하면서 잠깐 중지 시키는 것이더군요 ㅋㅋ

Ctrl + C와 Ctrl + Z 는 리눅스나 윈도우 같은 OS가 기본적으로 지원해주는 시스템호출을 통한 인터럽트 입니다!!

리눅스에서는 이러한 개념을 Signal 이라고 하는 것 같아요.

https://en.wikipedia.org/wiki/Unix_signal


Ctrl-C (in older Unixes, DEL) sends an INT signal ("interrupt", SIGINT); by default, this causes the process to terminate.

Ctrl-Z sends a TSTP signal ("terminal stop", SIGTSTP); by default, this causes the process to suspend execution.

Ctrl-\ sends a QUIT signal (SIGQUIT); by default, this causes the process to terminate and dump core.

Ctrl-T (not supported on all UNIXes) sends an INFO signal (SIGINFO); by default, and if supported by the command, this causes the operating system to show information about the running command.

These default key combinations with modern operating systems can be changed with the stty command.


좀 더 자세하고 다양한 내용은 아래를 참조하면 좋을 것 같습니다.

시그널의 명령어 리스트 : kill -l

시그널의 의미 (/usr/include/asm/signal.h)


자, 그럼 왜 Ctrl + C가 먹히지 않았을까..

검색을 해보자!!

리눅스 C 프로그래밍에는 signal() 이란 함수가 있습니다!!

프로세스에서 아래와 같이 호출하면, Ctrl + C가 무시되도록 설정됩니다!!

signal(SIGINT, SIG_IGN); // SIGINT 명령을 무시하도록 설정 


아래와 같이 handler를 추가해서 커스터마이즈한 활용도 가능합니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int  main(void)
{
     signal(SIGINT, INThandler);
     while (1)
          pause();
     return 0;
}
 
void  INThandler(int sig)
{
     char  c;
 
     signal(sig, SIG_IGN);
     printf("singnal test");
}

cs




 

Linux - 디렉토리 용량 확인

Posted by ironmask84
2018. 5. 13. 00:02 나는 프로그래머다!/Linux




회사에서 프로젝트 개발에 OS를 리눅스 Yocto를 사용하고 있는데,

아직 리눅스 사용이 아직 익숙하지가 않습니다.. 

임베디드 + CUI 환경이어서, 더욱 직관적이지가 않다보니...

윈도우에 익숙해온 것이 무서운 것인지.. 확실히 리눅스가 UI, UX 측면에서는 부족한 느낌입니다.

확실히 개발자에게 적합한 환경이랄까요.. CUI 환경자체가.. 단순하니 그런 것 같습니다.


아무튼 임베디드 환경은 용량이 제한적일 수 밖에 없습니다.

한번 쯤 디스크 용량 체크를 해보고 싶을 때가 오는데요.

적당한 명령어는 아래와 같습니다. ^^


du -h /폴더명 : 디렉토리별, 하위 디렉토리까지 확인

du -hs /폴더명 : 하위 디렉토리까지 확인

du -h --max-depth=2 디렉토리 : 디렉토리별 용량 확인

du -s 폴더명 : 해당 폴더의 용량

du -s ./* : 해당 폴더 소속 모든 폴더 용량.

df -h : 파티션 용량 확인




 

임베디드 리눅스 시스템 스터디

Posted by ironmask84
2017. 9. 26. 23:46 나는 프로그래머다!/Linux



HW를 동작시키는 SW 중에는


OS가 없는 펌웨어를 제외하고,


OS를 탑재시키는 경우에 리눅스를 많이 사용합니다.


C언어 기반이어서 HW 호환성(chip set)이 좋을 뿐아니라, 

오픈소스이기 때문에 로열티없이 사용도 가능하기 때문이죠 :)


하지만, 상용 OS가 아니기에 서비스 지원이 따로 없으므로...

개발자들에게 높은 수준의 개발능력을 요구합니다..

안좋게 말하면, 개발자들이 죽쑤게 된다는 것이죠 ㅜㅜ



저 또한 약 1년 전부터 실무에서 BSP 레벨 개발 업무를 맡게 될 것을 대비하여

리눅스에 대해서 공부를 하려고 했습니다.

http://ironmask.net/297 )


하지만, 개인적 사정으로 8개월 정도 텀이 생기게 되었고...

현재는 라즈베리파이로 개인 스터디를 해보려 하고 있습니다.. ㅋㅋ

http://ironmask.net/349 )


5년 전쯤에 Android Porting & Structure 이란 교육을 받은 적이 있습니다.

회사에서 Android 업무를 늦게나마 (2012년에 받았지만, 안드로이드는 2009년부터 이미 시작되어 왔기에..)

부랴부랴 받았을 때, 리눅스에 대해 잠깐 배운 기억이 있습니다.

Android 도 리눅스 커널을 OS를 사용하기 때문이죠 :)

이 때 교육은 5일짜리 였습니다.


5년 후인 이번주에 임베디드 리눅스 시스템이란 교육을 받고 있는데요.

이 교육도 5일짜리 입니다.

5일로는 방대한 내용의 교육입니다만, 

교육 받는 것도 감지덕지 하면서 최대한 배우려 애를 써봅니다. ㅋㅋ


짧은 지식이지만, 앞으로 계속 정리해가는 차원에서

글 몇개 씨리즈로 올려보겠습니다. ^^


임베디드 시스템 개념 정리 : http://ironmask.net/384







 

top 명령어 (실시간 CPU 사용률 체크)

Posted by ironmask84
2017. 8. 4. 16:52 나는 프로그래머다!/Linux



리눅스 명령어 중에 'top' 라는 것이 있습니다.

실시간으로 CPU 사용률 체크를 해주는 도구인데요.

리눅스를 사용하는 디바이스의 성능이나 리눅스 서버의 성능을 체크할 때 매우 유용합니다.

어떤 프로세스가 CPU를 과다하게 잡고 있는지 분석이 가능하지요 :)

기본적인 실행화면은 아래와 같습니다.


맨 윗줄부터

16:25:10 현재 서버의 시간

1user : 한명의 사용자가 접속

load average : 부하율


tasks 에서 259 total은 257개의 프로세스가 가동중

2 running 2개의 프로세스가 실행중

257 sleeping : 257개의 프로세스가 대기중

0 stopped : 0개의 프로세스가 멈춤

0 zombie : 0개의 프로세스가 좀비상태


-- CPU --

%us  : 유저 레벨에서 사용하고 있는 CPU의 비중

%sy : 시스템 레벨에서 사용하고 있는 CPU비중

%id : 유휴 상태의 CPU 비중

%wa : 시스템이 I/O 요청을 처리하지 못한 상태에서의 CPU idle 상태인 비중


-- 메모리 --

Mem:   32946200total,  25504432k used,   7441768k free,  53460k buffers 

전체 물리적인 메모리, 사용중인 메모리(used), 사용되지 않는 여유 메모리(free), 버퍼된 메모리(buffers)

Swap:  17101184k total,    11708k used,  17089476k free,  22014132k cached 

전체 스왑 메모리, 사용중인 스왑 메모리, 남아있는 스왑메모리, 캐싱메모리



-- 프로세스 상태 --

PID : 프로세스 ID (PID)
USER : 프로세스를 실행시킨 사용자 ID
PRI : 프로세스의 우선순위 (priority)
NI : NICE 값. 일의 nice value값이다. 마이너스를 가지는 nice value는 우선순위가 높음.
VIRT : 가상 메모리의 사용량(SWAP+RES)
RES : 현재 페이지가 상주하고 있는 크기(Resident Size)
SHR : 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합.
S : 프로세스의 상태 [ S(sleeping), R(running), W(swapped out process), Z(zombies) ]
%CPU : 프로세스가 사용하는 CPU의 사용율
%MEM : 프로세스가 사용하는 메모리의 사용율
COMMAND : 실행된 명령어


-- top 실행후 명령어 --

 shift + p

 CPU 사용률이 높은 프로세스 순서대로 표시

 shift + m

 메모리 사용률이 높은 프로세스 순서대로 표시

 shift + t

 프로세스가 돌아가고 있는 시간 순서대로 표시

 - k

 프로세스  kill  - k 입력 후 종료할 PID 입력 signal을 입력하라고 하면 kill signal인 9를 입력

 - a

 메모리 사용량에 따라 정렬

 - b

 Batch 모드 작동

 - c

 명령행/프로그램 이름 토글

 - d

 지연 시간 간격은 다음과 같다. -d ss. tt (seconds.tenths)

 - h 

 도움말 

 - H

 스레드 토글

 - i

 유휴 프로세스 토글

 - m

 VIRT/USED 토글

 - M

 메모리 유닛 탐지

 - n

 반복 횟수 제한 : -n number

 - p

 PID를 다음과 같이 모니터 : -pN1 -pN2 ... or -pN1, N2 [, ...] 

 - s

 보안 모드 작동

 - S

 누적 시간 모드 토글

 - u

 사용자별 모니터링 : -u somebody

 - U

 사용자별 모니터링 : -U somebody

 - v

 version

 space bar

 refresh

 - u

 입력한 유저의 프로세스만 표시 - which u

 숫자 1

 CPU Core별로 사용량을 보여준다.

 

 


 

쓰레드 함수 (pthread) 알아 보기

Posted by ironmask84
2017. 8. 1. 09:46 나는 프로그래머다!/Linux



저는 쓰레드 프로그래밍을 JAVA언어로 먼저 배웠고, 사용해봤습니다.

흔히, 아래와 같은 예로 개념 이해를 시작하게 됩니다.
은행에 돈 인출을 한 계좌에서 2건이 거의 동시에 일어났을 때 순차적으로 거래가 이뤄지지 않고,
선 거래 건이 이뤄지기 전에 후 거래가 전산적으로 먼저 처리되는 꼬임 ㅋㅋ

아무튼 JAVA로 채팅 프로그램을 만들때 사용해보고,
실기시험을 통한 간단한 예시 정도로만 코딩을 해보고는
실무에서 직접 생성해서 적용하는 걸 거의 못해봤네요 ㅠㅠ
(거의 구현된 것을 디버깅 하는 경우가 많다보니..)

아무튼 그리하여, 이번 기회에 좀 더 이해하고 정리하는 기분으로 글 하나 작성합니다.

리눅스 환경이면 gcc가 있을테니 바로 사용가능하고,
윈도우의 경우 MinGW나 Cygwin을 설치하면 크로스 컴파일이 가능해집니다.

크로스 컴파일 --> http://ironmask.net/298


출처:

http://enst.tistory.com/95 [개발 이야기]



또한 1부터 num까지 세는 Thread는 하나씩 셀 때마다 1000마이크로 초(1ms)를 쉰다
쉬지 않으면 SumThread가 끝나기 전에 CountThread가 끝나버려서 Thread가 제대로 돌아갔는지 알 수 없기 때문이다.

PThread를 사용하려면 pthread.h를 인클루드 시켜줘야 한다.
또한 pthread_t 라는 자료형의 변수와 함수들을 사용해 thread를 제어한다.

pthread_t라는 변수형은 thread의 id를 저장한다.

이 프로그램에서 사용한 함수들은 이렇다.

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

이 함수는 thread를 생성하는 함수이다.
첫번째 인자는 생성할 thread의 id
두번째 인자는 thread의 특성인데, 보통 NULL을 집어넣는다.
세번째 인자는 thread를 실행할 함수가 온다. thread를 실행할 함수는 포인터 함수이므로 인자값으로 올 수 있다.
네번째 인자는 thread를 실행할 함수에 넣어줄 인자값이 온다. 인자값은 하나지만 여러개의 인자값을 넣어주는 꼼수도 존재한다.(이건 다음에 포스팅)

int pthread_join(pthread_t thread, void **rval_ptr);

이 함수는 main이나 부모 thread에서 자식 thread가 종료할 때까지 대기하는 함수이다. main이나 부모thread가 끝나버리면 자식 thread 또한 종료되기 때문이다.
첫번째 인자는 생성한 thread의 id
두번째 인자는 해당 thread가 종료되면 return받을 변수. 리턴받을 값이 없으면 NULL을 넣으면 된다.

void pthread_exit(void *rval_ptr);


이 함수는 thread를 종료할 때 사용한다.
첫번째 인자는 thread를 종료하고 pthread_join() 함수 두번째 인자에 리턴할 변수. 리턴할 값이 없으면 NULL을 넣으면 된다.

pthread_t pthread_self(void)

이 함수는 실행하고 있는 thread의 id를 리턴한다.


또한 gcc에서 PThread를 사용할 소스를 컴파일 할때 맨 뒤에 -lpthread 명령어를 붙여줘야 한다.





이런식으로
MinGW로 컴파일 할때도 마찬가지.

아래는 소스.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
 
void *CountThread(void *); 
void *SumThread(void *); 
 
int main(void
int num; 
int result[2]; 
int i, rc; 
pthread_t threads[2]; 
 
printf("input number : "); 
scanf("%d"&num); 
 
pthread_create(&threads[0], NULL&CountThread, (void *)&num); //Count를 할 Thread함수를 threads[0]에서 실행(인자값은 num) 
pthread_create(&threads[1], NULL&SumThread, (void *)&num); //Sum을 구할 Thread함수를 threads[1]에서 실행(인자값은 num) 
 
for(i = 0; i < 2; i++
rc = pthread_join(threads[i], (void **)&result[i]); 
 
if(rc != 0//rc가 0이 아니면 오류 발생 
printf("Error in thread[%d] : %d\n", i, rc); 
exit(1); 
 
printf("Result of CountThread : %d\n", result[0]); 
printf("Result of SumThread : %d\n", result[1]); 
 
return 0
 
void *CountThread(void *arg) 
int i; 
int num = *(int *)arg; //인자값을 사용해야할 때마다 일일이 void* 포인터에서 int* 포인터로 바꿔줘야 해서 귀찮아지므로 그냥 변수를 하나 만들어서 인자값을 넣어줌 
 
for(i = 1; i <= num; i++
printf("In CountThread(0x%lx) : %d\n", pthread_self(), i); 
usleep(1000); 
 
printf("CountThread End\n"); 
pthread_exit(NULL); //인자값을 return하고 Thread함수 종료 
 
void *SumThread(void *arg) 
int result, i; 
int num = *(int *)arg; 
 
for(result = 0, i = 1; i <= num; i++
result += i; 
 
printf("SumThread End\n"); 
pthread_exit((void *)result); //인자값을 return하고 Thread함수 종료(인자값이 void형 포인터로 들어가므로 void형 포인터로 형변환) 
 
 

cs


좀 더 간단한 예시

- 아규먼트를 사용하지 않는 함수의 경우

- arg에 NULL 을 삽입하여 생성

- 아규먼트를 받는 함수의 경우

-arg를 통해 아규먼트를 함께 넘겨주어야 함

void *

- pthread_create 함수 타입

- 아규먼트/반환 타입이 void * 인 함수를 실행

- void * 인 이유

- void * 는 주로 임의의 data type을 가리키는 용도로 사용

- 임의의 data type을 아규먼트/반환 값으로 넘겨줄 수 있음

단일 아규먼트 전달

- 아규먼트로 정수 n을 받고 0 ~ n-1 의 숫자를 출력하는 경우

- pthread_create의 마지막 아규먼트 사용(void * 로 integer 변수를 가리킴)

- main 스레드의 경우

- 아규먼트(n)를 가리키는 포인터 설정

- 포인터를 아규먼트로 넘김  

ex) Main 함수의 n 값을 아규먼트로 받아 Thread에서 0 ~ n 까지의 값을 출력

출처: http://ypangtrouble.tistory.com/70 [끄적끄적 소소한 일상]



참고:

http://underresearch.blogspot.kr/2013/05/pthread-thread.html

http://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference#AEN226

http://www.morenice.kr/75

http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread

http://m.blog.naver.com/cky5122/80198083088

http://www.joinc.co.kr/w/Site/Thread/Beginning/PthreadApiReference#AEN226

https://kldp.org/node/93835

http://blog.naver.com/rbosc/90016327317





 

grep 명령어 - 문자열 패턴 검색

Posted by ironmask84
2017. 7. 7. 14:14 나는 프로그래머다!/Linux


Unix/Linux 문자열 패턴 검색 (grep)


  패턴 검색 [grep] 

grep 명령은 파일 내에서 지정한 패턴이나 문자열을 찾은 후에, 그 패턴을 포함하고 있는 모든 행을 표준 출력해 준다. 물론, 한 디렉토리 내에서 지정한 패턴을 포함하는 파일을 출력할 수도 있다. grep 명령은 하나 이상의 파일로부터 프로그램 수정 등을 위해 변수, 또는 함수명을 찾을때 많이 사용된다. 



  grep 명령의 기본 문법 

grep [-옵션] 패턴 파일명 


   옵션

-c : 패턴이 일치하는 행의 수를 출력 

-i : 비교시 대소문자를 구별 안함 

-v : 지정한 패턴과 일치하지 않는 행만 출력 

-n : 행의 번호를 함께 출력 

-l : 패턴이 포함된 파일의 이름을 출력 

-w : 패턴이 전체 단어와 일치하는 행만 출력 


   사용 예 

$ grep -n '삼성' token_dic

= token_dic 이라는 파일내에서 '삼성' 이라는 패턴이 들어간 문자열과 행번호를 출력 


$grep -l '삼성' * 

= 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 파일의 이름을 출력 


$grep -v '삼성' * 

= 현재 디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어가지 않은 행을 출력


$grep -r '삼성' * 

= 현재 디렉토리 및 서브디렉토리의 모든 파일에서 '삼성' 이라는 패턴이 들어간 문자열 출력



  패턴의 정규 표현식(Regular Expression) 

패턴 지정에서 사용되는 정규 표현식은 작은 따옴표 (' ')로 묶어서 표현한다. 

$ grep '^a' 파일명 

= ^는 파일의 시작을 나타냄. 파일에서 a로 시작하는 행을 찾는다. 

$ grep 'apple$' 파일명

= $는 파일의 끝을 나타냄. 파일에서 e로 끝나는 행을 찾는다. 

grep 'app*' 파일명 

= 파일에서 app로 시작하는 모든 단어를 찾는다. 

$ grep 'a.....e' 파일명 

= 파일에서 a로 시작하고 e로 끝나는 7자리 단어를 찾는다. 

$ grep [a-d] 파일명 

= 파일에서 a,b,c,d 로 시작하는 단어를 모두 찾는다. 

$ grep [aA]pple 파일명 

= 파일에서 apple 또는 Apple로 시작하는 단어를 모두 찾는다.

$ grep 'apple' d*

= d로 시작하는 모든 파일에서 apple 를 포함하는 모든 행을 찾는다. 

$ grep 'apple' 파일명1 파일명2 

= 지정된 두개의 파일에서 apple 를 포함하는 모든 행을 찾는다. 

$ grep '^[ab]' 파일명 

= 파일에서 a나 b로 시작되는 모든 행을 찾는다. 



출처: http://ra2kstar.tistory.com/100 [초보개발자 이야기.]

 

vi 편집기 기본 명령어

Posted by ironmask84
2017. 7. 7. 10:19 나는 프로그래머다!/Linux


vi 실행

  vi [파일명] : 기존 파일을 열거나 새로운 파일을 작성

  vi +<숫자> [파일명] : <숫자>행에 해당 파일 열기

  vi +/"검색어" [파일명] : 파일을 열어서 "검색어"의 처음 발견된 단어에서부터 

  vi -r [파일명] : 손상된 파일 복구

  view [파일명] : 읽기 전용으로 파일 열기


편집기 상태에서 커서의 이동 관련 단축키

  h(←) : 커서를 왼쪽으로 이동

  j(↓) : 커서를 아래쪽으로 이동

  k(↑) : 커서를 위로 이동

  l(→) : 커서를 오른쪽으로 이동

  w : 한 단어 오른쪽으로 커서 이동

  b : 한 단어 왼쪽으로 커서 이동

  ^ : 라인의 처음으로 이동

  $ : 라인의 마지막으로 이동

  H : 화면의 맨 위로 이동

  M : 화면의 중간으로 이동

  L : 화면의 맨 아래로 이동

  Ctrl + F : 한 화면 뒤로 이동

  Ctrl + D : 반 화면 뒤로 이동

  Ctrl + B : 한 화면 앞으로 이동

  Ctrl + U : 반 화면 앞으로 이동


편집기 상태에서 문자 삽입 관련 단축키

  a : 커서 오른쪽에 문자 삽입

  A : 커서 오른쪽 행의 끝에 문자 삽입

  i : 커서 왼쪽에 문자 삽입

  I : 커서 왼쪽 행의 처음에 문자 삽입

  o : 커서 아래에 행 삽입

  O : 커서 위에 행 삽입

  Esc키 : 입력 상태에서 편집기 상태로 전환


편집기 상태에서 텍스트 변경하는 단축키

  cw : 단어 바꾸기

  R ; 현재 커서 위치부터 바꾸기

  r : 커서 위치 문자를 다른 문자로 바꾸기

  ~ : 대,소문자 변경

  J ; 현재 행과 아래 행 결합

  u : 이전 명령 취소

  x : 커서 위치 문자 삭제

  dw : 커서 위치 단어 삭제

  dd ; 커서 위치 행 삭제

  D : 커서 오른쪽 행 삭제

  : 5, 10 d   : 5-10번째 삭제


편집기 상태에서 텍스트 복사 및 이동

  yy : 커서 위치 행 복사

  <숫자>y : 커서 위치로부텨 <숫자>행 복사

  p : 붙여넣기

  : 1,2 co 3  : 1-2행을 3행으로 복사

  : 4,5 m 6   : 4-5행을 6행으로 이동


편집기 상태에서 행 번호 설정

  :set nu   : 행 번호 표시

  :set nonu : 행 번호 숨기기


편집기 상태에서 행 찾기

  G : 파일의 마지막 행으로 가기

  21G : 파일의 21번째 행으로 가기

  :<숫자>  : <숫자> 라인으로 가기


편집기 상태에서 파일을 파일로 삽입

  :r [파일명]   : 커서 다음에 파일 삽입

  :34 r [파일명]  : 파일을 34번째 행 다음에 삽입


편집기 상태에서 저장 및 종료

  ;q  : 변경한 내용이 없을 경우 종료

  :q!  : 변경한 내용이 있더라도 저장 없이 강제 종료

  :w  : 변경한 내용 저장

  :w! : 읽기 전용 파일이라도 변경한 내용 강제 저장

  :wq   or  :x   : 저장 및 종료

  :wq!  : 강제 저장 및 종료




vi 설정 ($ vi ~/.vimrc) (출처: http://ra2kstar.tistory.com/100 [초보개발자 이야기.])

유저 홈 디렉토리에서 '.vimrc' 파일에서 설정 가능

자동 들여쓰기

set autoindent 


C 프로그래밍을 할때 자동으로 들여쓰기

set cindent  


검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않게 하기

set nowrapscan  


백업 파일을 만들지 않기

set nobackup 


키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 하기

set visualbell  


화면 우측 하단에 현재 커서의 위치보기

set ruler 


Tab을 눌렀을 때 8칸 대신 4칸 이동

set tabstop=4  


자동 들여쓰기를 할때 4칸 들여쓰기

set shiftwidth=4  


한글 처리를 하기위한 구문 

if $LANG[0] == `k' && $LANG[1] == `o'

set fileencoding=korea

endif


문법 강조 기능

if has("syntax")

syntax on " Default to no syntax highlightning 

endif



 

리눅스 기본 명령어 정리

Posted by ironmask84
2017. 7. 7. 10:08 나는 프로그래머다!/Linux


리눅스에서는 많은 명령어를 지원합니다.
저도 아직 배워가는 단계로 부족한게 많아요 ㅎㅎ
혹시 보시고 이상한게 있으면 댓글로 알려주세요~~


명령어 기초편

하위폴더 및 모든 파일을 복사하기
cp -rf ./../../mh.bae/VS950/vs950_ics_git/svlte_modem/ .  

하위폴더 및 모든 파일을 지우기
rm -rf svlte_modem

ls -l => 좀 더 구체적인 정보 제공(파일형태와 사용권한, 하드링크번호, 소유자, 그룹, 파일크기, 시간, 연도, 파일명)

file 파일명 => 파일의 정보 보여줌

경로명 쓰다가 Tab 2번 하면, 뒷경로 자동 완성

cd ../폴더명 => 상위로 갔다가 폴더명의 하위폴더로 이동

mkdir -p 경로명 =>  하위경로명으로 depth를 길게 해서 만들 경우, 없는 폴더가 있으면, 알아서 확인해준다.


자주 사용할만한 명령어

0. Screen 걸어놓기 (터미널 창 닫아도 됨)

-> screen -R 설정할이름

    screen 창 에서 실행할 명령어 수행시킴

    ctrl + A + D 로 screen 빠져나감

    screen -list 목록에서 확인

    list목록에서 숫자가 붙은 full name을 복사해서 screen -R 이름 으로 다시 들어갈 수 있음.

    exit 로 screen 빠져나가면 됨.

    

1. find 로 이름 기준 검색하기

ex) find . -name '*webidl*'


2. grep 으로 파일내 특정 단어로 검색하기

-> grep -wrns "검색어" *

(*는 모든 파일에서 찾겠다는 것임.  , 옵션은 하위폴더 등등 으로...)


3. repo forall -c git clean -xdf  클린


4. fuser -m 디렉토리 및 파일명 --> 해당 path에 rw시도중인 pid 알려줌

   위 명령어에서 검색된 pid를 가지고,

   ps | grep pid명  --> 해당 pid 정보


5. 압축하기 :   tar -cvzf 파일이름 압축할파일 혹은 /디렉토리

   압축풀기 :   tar -xvzf 파일이름  


많은 소스파일을 인덱싱해서 편리하게 파악하는 방법 (Source Insight 같은 기능)

ctags -R => 현재 폴더 하위까지 범위로 해서 tags 파일 생성

(리눅스코드는 ==>ctags -R --language-force=c++)

---> vim 으로 tags가 있는 폴더에서 해당 폴더나 하위폴더의 파일들을 vim으로 열면, 

        ctrl + ] : 정의 따라가기

        ctrl + T : 되돌아가기

        ctrl + W + F : 헤더파일 따라가기

        vim -t 함수명 : 함수명있는 곳으로 tag jump  (set cst, set tag+=/경로명/tags  를 .vimrc에 추가해야 가능)




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

명령어 응용편

df

하드 디스크의 용량이 얼마나 남아 있는지 확인하는 명령어

-a : 디폴트로 생략된 0 브록 크기의 파일 시스템도 보여줌

-i : 파일 크기를 블록 대신 inode 디스크 정보를 보여줌

-k : 파일 크기를 킬로바이트(kb) 보여줌

-T : 파일 시스템의 종류와 디스크 정보를 보여줌

-t : fstype 값을 가진 파일 시스템에 대한 디스크 정보

-h : 쉬운 용량 표시 단위로 표기( : 1G 250M 1K)

 

ps

작동중인 프로세스 상태 체크하기

-l : 포맷으로 출력

-u : 실행한 유저와 실행 시간을 표시

-j : "job"형식으로 표시

-s : 시그널(signal) 포맷으로 표시

-m : 메모리 정보 표시

-a : 다른 유저의 프로세스 현황 표시

-x : 터미널 제어없이 프로세스 현황을 표시

-ef : 가장 많이쓰는 옵션이죠 ^^

 

kill

실행중인 프로세스를 재활성화하거나 완전히 죽이고자 쓰이는 명령

-1, -HUP : 프로세스를 재활성화함

-9 : 프로세스를 강제로 죽임

 

로그인 화면 바꾸기

/etc/issue -> 콘솔접속시(로컬)

/etc/issue.net -> 원격접속시

/etc/motd -> 로그인 성공시

/etc/rc.d/rc.local -> 부팅시

 

RPM 패키지 설치 확인 설치 경로 확인하기

rpm -qa 패키지명 -> 설치 확인

rpm -ql 패키지명 -> 설치 경로 확인

 

시스템 사용자 보기

현재 시스템에 어떤 사용자가 접속되어 있는지 확인하려면  w, who, finger  명령을 실행하면 된다.

 

커널 메시지 보기

dmesg, cat /var/log/dmesg, cat /var/log/messages

 

사용중인 커널 버전 알아보기

uname -r , uname -a

 

최신 커널 버전 벙보 알아보기

finger @finger.kernel.org

 

시스템 하드웨어 정보 보기

cat /proc/cpuinfo -> CPU

cat /proc/meminfo -> Memory

cat /proc/interrupts -> interrupts

 

작동중인 커널 모듈 확인하기

/sbin/lsmod 명령을 실행

 

패킷 전달 과정 체크

traceroute

 

NTFS 모듈 설치하기

페도라 코어에서는 윈도우 NT 계열의 파일 시스템(NTFS) 지원하지 않으므로, 윈도우 엑스피 파티션을 마운트하려면 ntfs모듈을 설치해야 합니다.

yum install ntfs-3g

 

badblocks 이용한 하드 디스크 불량블럭 검사

badblocks -s /dev/sda

 

업데이트된 커널 소스 설치

yum install yum-utils

yumdownloader --source kernel --enablerepo updates-source


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

** adb shell 기준

1. cat /proc/kmsg > /persist-lg/kmsg.txt   <== kmsg를 /persist-lg/kmsg.txt 에 저장

2. logcat > /persist/log.txt       <== Android log를 /persist/log.txt에 저장

3. ps -aux | grep 프로세스명 <= 해당 프로세스의 정보를 보여줌

   pstree <= 현재 실행중인 프로세스를 tree로 보여줌 (부모-자식 관계)

4. adb 안될때, 

    adb devices

    adb kill-server

    adb start-server

    또 안되면 재부팅

5. kill -9 PID

    kill -l  <= signal 번호가 나온다??

6. logcat & => &을 옵션으로 두면, 해당 명령이 죽지않고, 백그라운드에서 돌게된다.

7. prop 파일 내용 수정해서 적용하기

단말에 존재하는 system/build.prop

Cmd> adb root

Cmd> adb remount

Cmd> adb pull system/build.prop

Cmd> 다음과 같이 수정함

ro.product.model=LG-F180L

ro.product.manufacturer=LGE

Cmd> adb push build.prop /system/

Cmd> adb reboot

 

Container_of 매크로

Posted by ironmask84
2016. 11. 9. 11:01 나는 프로그래머다!/Linux


Linux 소스 스터디 입문을 했습니다.

"리눅스 커널과 디바이스드라이버 실습2" 라는 책을 구입 후 보는 중인데,
리눅스에서 주로 사용하는 자료구조 쪽을 공부하다보니,
(기준 리눅스 커널 버젼은 2.6.31 이라고 합니다.)

소스 내에 container_of(ptr, type, member) 이라는 매크로를 소개하네요..
이름만 봐서는 argument들의 container.. 즉, C언어이니 구조체를 리턴해줄 것으로 보이는데,
container의 주소값을 얻는데 사용하는 것 같습니다.

첫 느낌은 뭔가 디게 복잡하게 주소값을 얻어오는 기분입니다만.. 이게 최선인가;;
매크로는 아래와 같습니다.

#define offsetof(TYPE, MEMBER) ((unsigned long) & ((TYPE *)0)->MEMBER)

#define container_of(ptr, type, member) ({ \

const typeof( ((type *)0)->member ) *_mptr = (ptr); \

(type *)( (char *)_mptr - offsetof(type, member) ); })

실제로 console로 결과값을 돌려보고, 머리를 굴려봐도 머리에 잘 안들어오네요 ㅜㅜ

검색하다가 리뷰가 잘되어있는 주소 링크합니다.
http://rootfriend.tistory.com/197
http://kldp.org/node/58409

주요내용은 아래에 따로 펌~

gcc C 언어 확장 기능으로, (즉, 표준이 아니며, 다른 컴파일러에서 지원하지 않는..) compound statement (중괄호로 둘러싼 여러 statement)를 expression으로 해석하는 기능이 있습니다. 예를 들면:

({ int y = foo(); int z;
if (y > 0) z = y;
else z = - y;
z; })


로 쓴 것처럼, foo() 리턴 값의 절대값을 얻는 코드를 위와 같이 작성할 수 있습니다. 이 것은 C99 표준에서 inline function이 나오기 전에 매우 유용하게 썼던 기능입니다. expression에서 switch, for 등의 statement를 쓸 수 있는 등의 장점을 얻을 수 있었습니다. 실제로 GNU C library에 포함되어 있는 obstack에 관계된 대부분의 함수가 이 compound-statement expression을 써서 macro로 구현되어 있습니다. 물론 맨 마지막 statement의 값이, 이 compound statement의 값이 됩니다.

그런데, 이 기능은 현재 C++에서 쓸 경우, 임시 변수의 destructor가 불리는 순서가 바뀌는 등의 단점이 있기 때문에, C++로 쓸 우려가 있는 코드에서는 이 compound statement expression을 쓰지 말라고 권하고 있습니다.

개인적으로 간단한 수식으로 나올 수 있는 것이 아니라면 do { ... } while (0)을 써서 macro로 만들고, 어떤 값을 리턴할 필요가 있는 macro라면 inline function을 쓰는 것이 좋다고 생각합니다.