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을 쓰는 것이 좋다고 생각합니다.

 

SW 프로그램과 개발환경(리눅스)

Posted by ironmask84
2016. 10. 31. 14:48 나는 프로그래머다!/기초 다지기





컴퓨터 공학 전공으로 졸업하고, 어언 6년이 지났건만.. 
아직 기초가 부족한 부분이 많은 것 같습니다.


학부 때는 단순히 윈도우 환경에서 Visual Studio나 Eclipse 프로그램을 사용하여
자연스런 컴파일 환경을 통해 프로그래밍 언어를 습득하기에만 정신이 없었고...

모바일 폰 개발 회사에서 재직하는 동안에도 선배들이 만들어놓은 개발 환경을 그대로 이용만 하여,
프로그래밍을 해왔기에..  개발 환경에 대해 제대로 개념을 익히는 시간이 거의 없었습니다..

학부 때 잠시나마 배웠던, 컴파일에 대한 개념도 가물가물 해졌습니다. ㅜㅜ (밑에 간단 정리..)


c언어 코딩 부터 실행파일까지의 기본 순서 : *.c -> *.s -> *.o -> *.exe or *.elf 등등

*compiler : 고수준코드(*.c)에서 목적 코드(*.o)로 옮기는 과정을 통합하여 수행하는 프로그램을 가리킨다.

*좁은 의미의 compiler : 고수준 코드(*.c)를 저수준 코드 (*.s)로 옮기는 과정을 수행하는 프로그램.

*assembler : 저수준 코드(*.s)를 목적 코드 (*o)로 옮기는 작업을 수행하는 프로그램.

*linker : 컴파일러가 만든 목적 코드 (*.o)와 library를 모아 기계어인 실행파일 (*.elf or *.exe)로 변환하는 프로그램.


사실 SW 개발자 입장에서 개발 환경은 한 번 셋팅 해놓으면, 크게 신경을 쓰지 않기에 지나치기 쉬운 것 같습니다.


임베디드 SW를 만드는 업을 해왔지만, 주로 윗단을 (Application 단 + Framework 단) 다루다가,
최근에 아랫단를 (펌웨어) 개발해야 할 기회가 왔기에.. 다시금 개발환경에 대해 파악해보려 합니다.


모바일 폰에 사용되는 칩셋(CPU)의 Core는 ARM을 이용합니다.


그리고 펌웨어 개발 환경은 대부분 리눅스 커널 환경을 사용하기에 이에 대해 잠시 집고 가볼까 합니다.

잘 정리해 주신 블로거님이 계시기에 아래에 퍼왔습니다.


일단 결론을 말씀드리자면, 아래와 같습니다.

1. 리눅스 환경에서 개발 시에는 거기서 제공하는 tool chain을 다운로드하여 사용
   (apt-get 툴을 이용해 필요한 버전의 툴 체인 설치)
2. 윈도우 환경에서 개발 시에는 주로 Cygwin(gcc 제공)을 이용하게 됩니다.

** ARM 타깃용 크로스 툴 체인 --> http://linaro.org 참조


우리가 윈도우즈 환경에서 리눅스 ARM 용 프로그램을 빌드하기 위해서는, 그에 맞는 바이너리를 생성해 줄 수 있는 환경( 컴파일러, API 등 )을 구성할 필요가 있다. 윈도우즈에서 이를 가능하게 해 주는 것이 POSIX 기반의 시그윈 개발 환경이다. 
--> Cygwin 에서는 Windows에서 사용가능한 리눅스 환경의 API들을 제공하고,
     tool chain (ARM용 gcc 크로스 툴 체인, 
git 등)을 제공합니다.


우리는  시그윈 환경을 이용해 리눅스 ARM 용 프로그램을 빌드하고, 그것을 안드로이드 장치로 복사하고 설치하게 된다. 이것이 윈도우즈와 리눅스 간의  크로스 플래폼 개발이다. 안드로이드 SDK 를 사용하게 되면 자바 바이트 코드( 플래폼에 독립적인 중간 코드 )를 생성하기 때문에 빌드 환경이 중요하지 않지만, 안드로이드 NDK 는 실제 리눅스 API 를 이용하고 기계어로 컴파일하기 때문에 반드시 올바른 환경에서 개발해야만 한다.



좀 더 자세한 내용은 아래 펌 참고...

http://lifeisforu.tistory.com/132  (안드로이드 NDK 개발환경 예시)



NDK 로 개발을 한다는 것이 의미하는 바가 무엇인지 생각해 볼 필요가 있다. 많이들 알고 있는 사실이겠지만, 어떤 프로그램이 어떤 머신에서 실행되기 위해서는 해당 머신에 맞는 실행가능한 파일( executable )을 만들어야만 한다. 그것이 소위 우리가 알고 있는 '컴파일'과 '링크'라는 작업이다. 이 컴파일 작업과 링크 작업을 합쳐서 '빌드'라고 표현한다.


우리가 열심히 코딩한 라인들은 어셈블리어로 변환되고, 이 어셈블리어들은 다시 기계어로 변환된다. 그리고 CPU 는 이 기계어를 마이크로 명령어로 나누어서 프로그램을 실행하게 된다. 그런데 이 CPU 가 어떠한 명령어 집합 구조( Instruction Set Architecture, ISA )를 제공하느냐에 따라서 다른 기계어를 만들어야 하기 때문에, 프로그램을 빌드할 때는 해당 CPU 에 맞는 구성을 만들어야 한다. 예를 들어 CPU 가 x86 ISA 를 제공한다면 x86 에 맞는 빌드 구성을 해야 하고, CPU 가 x86/64 를 제공한다면 거기에 맞는 빌드 구성을 만들어야 한다.


자 우리가 NDK 를 통해 만든 바이너리를 실행할 플래폼의 환경은 어떠한가? 일반적으로 현재 안드로이드 OS 가 돌아 가는 환경은 ARM 코어를 사용하는 리눅스 환경이다. 이는 어떠한 사실을 내포할까?


    • 우리가 C/C++ 응용프로그램을 개발할 때 CreateFile() 과 같은 Win32 API 를 사용할 수 없다.

    • Visual Studio 를 이용할 수 없다. --> VC++ 컴파일러를 사용할 수 없다.


사실 Visual Studio 의 컴파일러를 GCC( GNU Compiler Collection ) C++ 컴파일러로 연결해 놓고 개발할 수는 있을 것이다. 하지만 기본 환경 자체가 Win32 서브시스템과 x86 혹은 x86-64 아키텍처를 위한 개발에 최적화되어 있으므로 참 어려운 일이 될 것이다. 구글링을 해 보면 여러 가지 자료들이 나오기는 하는데 얼마나 편한 지는 잘 모르겠다. 어쨌든 우리는 리눅스 OS 를 기반으로 ARM ISA 에 맞춰서 빌드해야만 하는 상황이고, 윈도우즈 환경에서 이를 가능하게 만들 수 있는 방법을 찾아야만 한다. 


이때 우리에게 한 줄기 빛을 비춰주는 존재가 있으니, 그것이 바로 시그윈이다.


Cygwin 이란 무엇인가?



일단 시그윈 공식 사이트의 설명을 인용해 보도록 하겠다. 출처 : http://cygwin.com/index.html


시그윈은 :

  • 윈도우즈를 위해 리눅스처럼 느껴지는 환경을 제공하는 도구들의 집합이다.

  • 많은 리눅스 API 기능을 제공하는 리눅스 API 레이어로서 동작하는 DLL( cygwin1.dll )이다.


그리고 다음과 같이 착각하지 말라고 경고하고 있다.


시그윈은  :

  • 윈도우즈 상에서 네이티브 리눅스 앱들을 실행하는 방법이 아니다. 당신이 윈도우즈 상에서 프로그램을 실행하기 원한다면, 소스로부터 앱들을 리빌드해야만 한다.
  • signal, pty 등과 같은 유닉스 기능들을 인지하는 네이티브 윈도우즈 앱들을 마술처럼 만들어 주는 방법이 아니다. 다시 말하지만, 당신이 시그윈 기능의 이점을 취하기 원한다면, 소스로부터 앱들을 리빌드할 필요가 있다.


앞에서도 언급했지만 특정 CPU 아키텍처에 대해 리눅스용으로 빌드된 프로그램은 윈도우즈에서 실행될 수 없다. 당연히 윈도우즈 환경에 맞는 구성으로 다시 빌드해야만 한다. 시그윈은 크로스 플래폼 개발을 가능하게 해주는 환경일 뿐이지, 에뮬레이터가 아니라는 것을 명심해야만 한다.


Cygwin 의 작동 원리.



그렇다면 시그윈은 어떻게 해서 리눅스와 같은 개발 환경을 지원하게 되는 것일까?


여러분은 Visual Sutdio 를 통해 프로젝트 설정을 하다가 '서브시스템' 이라는 항목을 본 적이 있을 것이다. 윈도우즈는 여러 개의 서브시스템을 가지고 있는데, 우리가 주로 사용하는 것이 Win32 서브시스템이다. 아래 그림은 Windows NT 의 시스템 아키텍처에서의 POSIX 서브시스템을 보여 주고 있다.


윈도우즈 NT 시스템 아키텍처( 출처 : 위키피디아 )


이 POSIX 라는 것은 Portable Operating System Interface 의 약자로 IEEE 가 운영체제 간의 호환성을 유지하기 위해서 제정한 표준이다.


POSIX( 대충 '파직스'라고 발음됨 )는 "Portable Operating System Interface" 의 머리글자들이며, 운영체제 간의 호환성을 유지하기 위해서 IEEE 에 의해 제정된 표준 패밀리이다. POSIX 는 다양한 유닉스 및 다른 운영 체제들 간의 소프트웨어 호환성을 위해 응용프로그램 인터페이스( API )와 명령줄 쉘, 그리고 유틸리티 인터페이스들을 정의한다.


중략...


유닉스 같은 운영 체제 환경을 위한 POSIX 명세는 원래 코어 프로그래밍 인터페이스를 위한 단일 문서로 구성되어 있었지만, 결국에는 19 개의 분리된 문서로 늘어 났다( 예를 들면 POSIX1, POSIX2, 등 ). 표준화된 사용자 명령 줄과 스크립팅 인터페이스들은 Korn Shell 에 기반했다. awk, echo, ed 등을 포함하는 많은 사용자 수준 프로그램, 서비스, 유틸리티들도 표준화되었으며, 기본적인 I/O( 파일, 터미널, 네트웤 )을 포함하는 프로그램 수준 서비스들도 포함한다. POSIX 는 표준 스레딩 라이브러리 API 도 정의하는데, 이는 현대의 거의 대부분의 OS 에 의해서 지원된다. 요새는 대부분의 POSIX 파트들이 하나의 IEEE Std 1003. 1-2008 표준에 포하모디었으며, 이는 POSIX 1-2008 로 알려져 있다.


하략...


- 출처 : 위키피디아, POSIX


OS/2 라는 것은 MS 와 IBM 이 초기에 제작한 운영체제로 요새는 별로 의미가 없으므로 관심있는 분들은 위키피디아의 OS/2 라는 글을 따로 읽어 보기 바란다.


POSIX 를 지원하는 OS 리스트는 다음 링크의 'POSIX-oriented operating systems' 절에서 찾아 볼 수 있다 : 위키피디아, POSIXGNU/Linux 같은 경우에는 POSIX 에 대해 '거의 대부분의 호환성' 을 가지고 있다. 시그윈은 POSIX 에 대해 '많은 호환성' 을 가지고 있다고 표현되고 있다. 즉 안드로이드 시스템의 기반이 되는 리눅스가 POSIX 를 거의 완벽하게 지원하고 있기 때문에, 우리는 윈도우즈 상에서 시그윈을 통해 거기에 맞는 환경을 구성할 수 있는 것이다.


위에서 윈도우즈의 POSIX 서브시스템에서 언급을 했는데 여기에서 윈도우즈의 POSIX 를 언급한 것은 그냥 예를 든 것 뿐이다. 시그윈이 윈도우즈의 POSIX 서브시스템의 레이어라는 이야기는 아니다. 왜 그럴까? 윈도우즈의 POSIX 서브시스템은 POSIX 표준을 제대로 지키고 있지 않기 때문이다. 


시그윈은 윈도우즈의 POSIX 와는 개별적으로 동작하는 개발환경이다. 시그윈 환경, 시그윈 서브시스템, 시그윈 플래폼 등의 용어를 사용해도 무방하지 않을까 싶다. 시그윈이 윈도우즈의 POSIX 서브시스템의 레이어로서 동작하지 않는 이유는 다음 글을 보면 좀 더 이해가 가지 않을까 싶다 : The Sad History of the Microsoft POSIX Subsystem. 아래에 일부만 인용해 보았다. 요약하면 윈도우즈 POSIX 가 허접(?)이란 것과 XP 부터는 POSIX 서브시스템을 지원하지 않는다는 것이다. 그 뒤의 이야기가 쭉 나오는데 다 읽어 보지는 못했다.


윈도우즈 NT 가 처음 개발되고 있었을 때, 목표 중의 하나는 커널을 프로그래밍 인터페이스와 분리하는 것이었다. NT 는 원래 OS/2 를 성공시키기 위한 것이었지만, 마이크로소프트는 윈도우즈 3.x 응용프로그램들을 실행하기 위한 호환성을 포함시키고, 방위산업 시장에 판매하기 위한 1980 년대 DoD( 국방성 ) Orange Book 과 FIPS 명세들을 만족시키기 원했다. 결과적으로 윈도우즈 NT 는 복잡한 자유재량에 의한 접근 제어 기능을 가진 멀티유저 플래폼으로서 개발되었으며, 하이브리드 마이크로커널 3 유저랜드1 환경들로서 구현되었다 :


  • Windows( Win32 )
  • OS/2
  • POSIX


마이크로소프트는 Win32 문제를 가지고 IBM 과 다퉜으며, NT 프로젝트는 OS/2 와 갈라섰다. 팀의 초점은 Win32 로 이동했다. 그래서 Win32 API 를 호스트하는 Client Server Runtime Subsystem( CSRSS ) 은 의무적이 되었으며, OS/2 와 POSIX 서브시스템이 실제로 완료되지 않았음에도 불구하고 그것들은 윈도우즈 NT 부터 윈도우즈 2000 까지 5 개의 버전에 포함되었다. OS/2 서브시스템은 단지 OS/2 1.0 명령줄 프로그램들만을 실행할 수 있으며, presentation manager 에 대한 지원이 존재하지 않았다. POSIX 서브시스템은 POSIX.1 명세를 지원했지만, 모든 종류의 쉘이나 유닉스 같은 환경을 제공하지 않았다. Win32 가 윈도우즈 95 의 형태에서 성공하면서, OS/2 와 POSIX 서브시스템의 개발은 중단되었다. 그것들은 윈도우즈 XP 와 윈도우즈 서버 2003 에서 완전히 죽고 사라졌다.


반면에 Softway Systems 는 1996 년 쯤에 OpenNT 라고 불리는 유닉스-윈도우즈 NT 간 포팅 시스템을 개발했다. OpenNT 는 NT POSIX 서브시스템 상에서 빌드되었지만, 그것에 살을 붙여 이용할 수 있는 유닉스 환경을 제공했다. 이는 유닉스 시스템이 매우 비싸진 시점이었다. Softway 는 OpenNT 를 사용해서 US Federal agency 들을 위한 여러 유닉스 응용프로그램들을 윈도우즈 NT 로 변경했다. 1998 년에 OpenNT 는 Interix 라고 이름을 바꿨다. Softway Systems 는, 마이크로소프트 POSIX 서브시스템이 지원하지 않았던 시스템 호출을 구현하고, 풍부한 libc,  파일 시스템에 대한 single-rooted view, 그리고 실용적인 gcc 를 개발하기 위해, 최종적으로 NT POSIX 서브시스템에 대한 완전한 대체물을 만들었다.


하략...


위키피디아에 의하면 Windows Server 2003 R2 부터는 사실은 Interix 의 변형인 SUA( Subsystem for UNIX-based Applications )를 통해서 POSIX 를 지원하고 있다고 한다. 이것은 SFU( Windows Services for UNIX )라고 불리기도 한다. Windows Vista 및 Windows 7 의 Enterprise 에디션과 Ultimate 에디션도 SUA 를 포함하고 있다고 한다. 자세한 내용은 Windows Services for UNIX 를 참조하라.


결론.



우리가 윈도우즈 환경에서 리눅스 ARM 용 프로그램을 빌드하기 위해서는, 그에 맞는 바이너리를 생성해 줄 수 있는 환경( 컴파일러, API 등 )을 구성할 필요가 있다. 윈도우즈에서 이를 가능하게 해 주는 것이 POSIX 기반의 시그윈 개발 환경이다. 


우리는  시그윈 환경을 이용해 리눅스 ARM 용 프로그램을 빌드하고, 그것을 안드로이드 장치로 복사하고 설치하게 된다. 이것이 윈도우즈와 리눅스 간의  크로스 플래폼 개발이다. 안드로이드 SDK 를 사용하게 되면 자바 바이트 코드( 플래폼에 독립적인 중간 코드 )를 생성하기 때문에 빌드 환경이 중요하지 않지만, 안드로이드 NDK 는 실제 리눅스 API 를 이용하고 기계어로 컴파일하기 때문에 반드시 올바른 환경에서 개발해야만 한다.


이제 시그윈이라는 것의 정체에 대해 어느 정도 이해할 수 있게 되었을 것이라 생각한다. 그리고 시그윈을 통해 뭔가를 빌드한다는 것의 의미에 대해서 이해할 수 있게 되었을 것이라 생각한다.



'나는 프로그래머다! > 기초 다지기' 카테고리의 다른 글

컴퓨터 시스템과 임베디드 시스템 개념  (0) 2017.09.25
유니코드 이해 하기  (0) 2017.09.19
디자인패턴  (0) 2017.04.01
윈도우 환경에서의 gcc  (0) 2016.10.31
 

Cygwin 관련 팁들

Posted by ironmask84
2010. 12. 2. 16:39 나는 프로그래머다!





윈도우 환경에서 linux 기반 크로스컴파일 개발환경으로 쓰이는 것이 Cygwin인데요.

간단한 팁들 공유합니다.


setup.exe를 실행시킨 후 "Select Packages" 단계에서

Base Category 안의 cygwin 패키지를 확인해 보셔도 되고,

Cygwin을 실행시키고 다음 명령을 내려서 확인하셔도 됩니다.

$ uname -a

CYGWIN_NT-5.0 w2kbox 1.5.13(0.122/4/2) 2005-03-01 11:01 i686 unknown unknown Cygwin

혹은 cygcheck 명령을 써도 됩니다.

$ cygcheck -s | less

...

   Cygwin DLL version info:
       DLL version: 1.5.13
       DLL epoch: 19
       DLL bad signal mask: 19005
       DLL old termios: 5
       DLL malloc env: 28
       API major: 0
       API minor: 122
       Shared data: 4
       DLL identifier: cygwin1

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

cygwin 삭제 방법

 

공식 사이트(http://cygwin.com) FAQ에 적힌 내용을 보면...

 

1. cygwin 폴더를 지운다. 안지워 질때는 시그윈이 사용중임으로 사용중인 시그윈을 모두 종료한다.

 

2. 레지스터를 지운다. 다음 두군데에서

    [HKEY_LOCAL_MACHINE\SOFTWARE]

    [HKEY_USERS]

    안에 Cygnus Solutions 키를 지운다.

 

3. 윈도우에 있는 바로가기를 지운다.


이렇게 한다고 합니다.