728x90

[ 기준 환경 ]

CentOS

SSD 가상서버 퍼스트클래스

인증서종류 : SSL보안 라이트 

 

모든 인증서를 받아 서버에 업로드

 

1. 인증서 파일 합치기

cat ssl.crt chain_all_ssl.crt > domain.pem

2. 만약 해당 합친 파일에 아래 내용이 개행되어있지않다면 vi로 열어 개행하여 저장

-----END CERTIFICATE----- -----BEGIN CERTIFICATE-----

 

3. 서버 시작 시마다 인증서 비밀번호 입력 생략하도록 복호화

openssl rsa -in ssl.key -out new_ssl.key

서버 구매 시 입력했던 비밀번호를 입력 

 

4. nginx 기본설정파일 수정

cd /etc/nginx/conf.d
vi default.conf

default.conf의 내용을 아래와 같이 수정 (domain이나 백엔드 url:port 등은 환경에 맞게 알아서 수정)

아래 예시 기준으로는 프론트의 백엔드 api 요청 주소가 https://domain.co.kr/api

server {
        client_max_body_size 50M;

        listen 80;
        server_name domain.co.kr;
        return 301 https://$host$request_uri;
}

server {
        client_max_body_size 50M;

        listen 443;
        server_name domain.co.kr;

        root  /var/www/project/dist;
        index index.html;

        ssl on;
        ssl_certificate /var/www/ssl/domain.pem;
        ssl_certificate_key     /var/www/ssl/new_ssl.key;
        ssl_protocols TLSv1.1 TLSv1.2;


        set $service_url http://127.0.0.1:3001;

        location /api/{
                proxy_read_timeout 5m;
                proxy_connect_timeout 5m;
                proxy_send_timeout 5m;

                rewrite ^/api(/.*)$ $1 break;
                proxy_pass http://127.0.0.1:3001;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }


        location / {
                try_files $uri $uri/ /index.html;
        }
}
~

 

그 뒤 nginx 재시작

systemctl restart nginx
728x90

1. 우선 컴파일 시에 디버깅 정보를 담아야 한다.
 gcc -g -o [프로그램명] [소스파일명]
 디버깅 옵션인 -g 으로 컴파일하며, 최적화 옵션인 -O 은 주지 않도록 한다.

2. 실행방법
 gdb [프로그램명]
 gdb [프로그램명] [core파일명]
 gdb [프로그램명] [실행중인프로세스pid]


3. 종료방법
 q
 Ctrl + d

4. 소스 찾아가기 (list)
 l   : main 함수를 기점으로 소스의 내용이 출력된다
 l 10  : 10 행 주변의 소스가 출력되는데 10 - 5 행부터 10 + 5행까지 총 10행이 출려된다.
 l func  : func 함수의 소스를 출력
 l -5  : 기본값으로 10줄이 출력된다고 가정하고, 다음에 출력될 라인이 11라인이라면, 10(마지막라인) - 5 라인을 중심으로 출력된다. 즉, 그대로 1~10라인이 출력된다.
 l a.c:func : a.c 파일의 func 함수부분을 출력
 l a.c:10 : a.c 파일의 10행을 기준으로 출력

5. 옵션
 set listsize 20 : 한번에 출력하는 행의 갯수를 20개로 늘린다.
 Enter  : 마지막으로 수행한 명령어를 다시 수행한다

6. 프로그램 실행, 종료 (run, kill)
 r   : 프로그램 수행 (재시작)
 r arg1 arg2 : arg1과 arg2를 인자로 프로그램 수행
 k   : 프로그램 수행종료

7. 역추적하기 (backtrace)
 bt   : 오류가 발생한 함수를 역으로 찾아간다.

8. 중단점 사용하기 (breakpoint, temporary breakpoint)
 b func  : func 함수에 브레이크 포인트 설정
 b 10  : 10행에 브레이크 포인트 설정
 b a.c:func : a.c파일의 func함수에 브레이크 포인트 설정
 b a.c:10 : a.c파일의 10행에 브레이크 포인트 설정
 b +2  : 현재 행에서 2개 행 이후 지점에 브레이크 포인트 설정
 b -2  : 현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정
 b *0x8049000 : 0x8049000 주소에 브레이크 포인트 설정 (어셈블리로 디버깅 시 사용)
 b 10 if var == 0 : 10행에 브레이크 포인트를 설정해되, var 변수 값이 0일 때 작동
 tb   : 임시 중단점을 사용하는 것으로 한번만 설정되며, 그 이후에는 삭제된다.

9. 중단점 설정하기 (condition)
 condition 2 var == 0 : 고유번호가 2번인 브레이크포인트에 var변수가 0일 때 동작하라고 설정

10. 중단점 삭제하기 (clear, delete)
 cl func  : func 함수의 시작 부분에 브레이크 포인트 지움
 cl 10  : 10행의 브레이크 포인트 지움
 delete 1 : 고유번호 1번의 브레이크 포인트를 지운
 cl a.c:func : a.c 파일의 func함수의 브레이크 포인트 지움
 cl a.c:10 : a.c 파일의 10행의 브레이크 포인트 지움
 cl   : 모든 브레이크 포인트 지움
11. 중단점 정보보기 (information)
 info b  : 현재 설정된 브레이크 포인트의 정보를 보여준다
 방향키Up/Down : 방향키 Up/Down을 누르면 히스토리 기능을 제공한다
 info br + TAB : info br 로 시작하는 키워드가 히스토리에 있다면 뿌려준다
 info TAB + TAB : info 뒤에 올 수 있는 인자 리스트를 보여준다
 TAB + TAB  : 현재 사용가능한 모든 명령어 리스트를 보여준다

12. 중단점 비활성화, 활성화 하기 (enable, disable)
 disable 2 : 고유번호 2번인 브레이크 포인트 비활성화
 enable 2 : 고유번호 2번인 브레이크 포인트 활성화

13. 디버깅 하기 (step, next, continue, until, finish, return, step instruction, next instruction)
 s  : 현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가서 수행된다
 s 5  : s를 5번 입력한 것과 동일
 n  : 현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어간다
 n 5  : n을 5번 입력한 것과 동일
 c  : 다음 브레이크 포인트를 만날때 까지 계속 수행한다
 u  : for 문에서 빠져나와서 다음 브레이크 포인트까지 수행한다.
 finish : 현재 함수를 수행하고 빠져나감
 return : 현재 함수를 수행하지 않고 빠져나감
 return 123 : 현재 함수를 수행하지 않고 빠져나감, 단, 리턴값은 123
 si  : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어간다.
 ni  : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어가지 않는다.

14. 감시점 설정 (watch)
 watch i : i변수에 와치포인트를 설정하고 i변수가 바뀔 때마다 브레이크가 걸리면서 이전값과 현재값을 출력한다.

15. 변수 정보보기 (info, print)
 info locals : 현재 상태에서 어떤 지역변수들이 있으며, 값은 어떠한지를 알 수 있다.
 info variables : 현재 상태에서의 전역변수 리스트를 확인할 수 있다.
 p lval  : lval 값을 확인한다.
 p func  : func 함수의 주소값을 확인한다.
 p pt  : pt가 구조체라면 구조체의 주소를 확인한다
 p *pt  : pt가 구조체라면 구조체의 값을 확인한다.
 p **pt  : *pt가 구조체라면 구조체의 값을 확인한다.
 info registers : 레지스트 값 전체를 한번에 확인한다.

16. 레지스트 값 및 포인터가 가리키는 구조체의 배열을 출력 (info, print)
 info all-registers : MMX 레지스트를포함하여 거의 대부분의 레지스트 값을 확인한다.
 p $eax  : eax 레지스트의 값을 확인한다. ( ex_ eax, ebx, ecx, edx, eip )
 p *pt@4  : 4크기의 배열로 gdb가 알 수 있으므로 4개의 크기만큼 가져와서 확인할 수 있다.

17. 중복된 변수명이 있는 경우 특정 변수를 지정해서 출력 (print)
 p 'main.c'::var : main.c 파일에 있는 전역변수인 var 변수의 값을 출력
 p hello::var : hello 함수에 포함된 static 변수인 var 변수의 값을 출력

18. 출력 형식의 지정
 p/t var : var 변수를 2진수로 출력
 p/o var : var 변수를 8진수로 출력
 p/d var : var 변수를 부호가 있는 10진수로 출력 (int)
 p/u var : var 변수를 부호가 없는 10진수로 출력 (unsigned int)
 p/x var : var 변수를 16진수로 출력
 p/c var : var 변수를 최초 1바이트 값을 문자형으로 출력
 p/f var : var 변수를 부동 소수점 값 형식으로 출력
 p/a addr : addr주소와 가장 가까운 심볼의 오프셋을 출력 ( ex_ main + 15 )

19. 타입이 틀릴 경우 타입을 변환하여 출력
 p (char*)vstr : 실제 컴파일 시에 (void *)형으로 되어있었다고 하더라도 (char *)로 캐스팅 하여 보여줌

20. 특정한 위치 지정
 p lstr + 4 : 예를 들어 lstr = "I like you." 라는 문자열은 "ke you."가 출력된다.

21. 변수 값 설정
 p lval = 1000 : 변수값 확인 이외에는 설정도 가능하다.

22. 출력명령 요약 (print)
 p [변수명]    : 변수 값을 출력
 p [함수명]    : 함수의 주소를 출력
 p/[출력형식] [변수명] : 변수 값을 출력 형식으로 출력
 p '[파일명]'::[변수명] : 파일명에 있는 전역변수 값을 출력
 p [함수명]::[변수명] : 함수에 있는 변수 값을 출력
 p [변수명]@[배열크기] : 변수의 내용을 변수 배열의 크기 형태로 출력

23. 디스플레이 명령 (display, undisplay)
 display [변수명]  : 변수 값을 매번 화면에 디스플레이
 display/[출력형식] [변수명] : 변수 값을 출력 형식으로 디스플레이
 undisplay [디스플레이번호] : 디스플레이 설정을 없앤다
 disable display [디스플레이번호] : 디스플레이를 일시 중단한다.
 enable display [디스플레이번호] : 디스플레이를 다시 활성화한다.

24. 스택이란
 스택의 경우는 상위 1기가는 커널에서 사용하며, 그 바로 아래 공간인 상위 0xBFFFFFFF 부터 하위로 늘어나게된다.
 상세한 디버깅을 위해서는 -g 옵션으로 디버깅 정보와 --save-temps 옵션을 통해 어셈블리 코드를 얻어낼 수 있다.
 상위 프레임으로 갈 수록 메인 함수에 가까워 지는 것이다.

25. 스택 프레임 관련 명령 (frame, up, down, info)
 frame [N] : n번 스택 프레임으로 변경
 up   : 상위 프레임으로 이동
 up [N]  : n번 상위 스택 프레임으로 이동
 down  : 하위 프레임으로 이동
 down [N] : n번 하위 스택 프레임으로 이동
 info frame : 현재 스택 프레임 정보를 출력
 info args : 현재 스택 프레임의 함수가 호출될 때 인자를 출력
 info locals : 현재 스택 프레임의 함수내의 지역변수를 출력
 info catch : 현재 스택 프레임의 함수내의 예외 핸들러를 출력

26. 스택 트레이스 하는법
 b main 또는 원하는 곳에 브레이크 포인트를 잡고
 오류가 발생할 때 까지 c를 통해 진행하면, 세그먼트 폴트 등의 오류가 발생하고 디버그가 멈추는데
 여기서 bt 를 통해서 전체 스택 프레임을 확인하고 어떤 함수에서 호출시에 문제가 발생하였는지 확인
 단, 일반적인 라이브러리에서는 오류발생 확률이 없다고 보고, 그 함수를 호출시에 문제를 의심한다.
 다시 프레임을 이동하면서, 로컬변수와 전역변수 등을 확인하면서 디버깅이 가능하다.

27. 메모리 상태 검사 (x)
 x/[범위][출력 형식][범위의 단위] : 메모리의 특정 범위의 값들을 확인할 수 있다.
 이렇게 메모리를 직접 읽어보는 일은 -g 옵션을 가지고 컴파일 되지 않은 실행파일을 디버깅 할때에 자주 사용된다.
 즉, x/10i main 과 같이 역 어셈블하여 해당 코드를 추측하는 것이다.

28. 출력형식
 x/10 main : main 함수 시작부터 40바이트를 출력한다. 출력형식은 다음과 같다.
 x/10t main : main 함수 시작부터 40바이트를 2진수로 출력
 x/10o main : main 함수 시작부터 40바이트를 8진수로 출력
 x/10d main : main 함수 시작부터 40바이트를 부호가 있는 10진수로 출력 (int)
 x/10u main : main 함수 시작부터 40바이트를 부호가 없는 10진수로 출력 (unsigned int)
 x/10x main : main 함수 시작부터 40바이트를 16진수로 출력
 x/10c main : main 함수 시작부터 40바이트를 최초 1바이트 값을 문자형으로 출력
 x/10f main : main 함수 시작부터 40바이트를 부동 소수점 값 형식으로 출력
 x/10a main : 가장 가까운 심볼의 오프셋을 출력
 x/10s main : 문자열로 출력
 x/10i main : 어셈블리 형식으로 출력

29. 범위의 단위 (기본 word - 4바이트)
 x/10b main : byte - 1바이트 단위 - 10바이트 출력
 x/10h main : halfword - 2바이트 단위 - 20바이트 출력
 x/10w main : word - 4바이트 단위 - 40바이트 출력
 x/10g main : giant word - 8바이트 단위 - 80바이트 출력

30. 디스어셈블링 (disas)
 disas func : 어셈블리 코드를 좀 보편적으로 보기 위한 명령어
 disas 0x8048300 0x8048400 : 특정 주소 범위사이의 어셈블리 코드를 보기

31. 함수호출 (call)
 call func(arg1, arg2) : 특정함수 func를 arg1, arg2 파라메터를 포함하여 호출하고, 반환값은 출력

32. 점프 (jump)
 jump *0x08048321 : 해당 주소로 무조건 분기하여 인스트럭션을 계속 수행한다.
 jump 10  : 무조건 10행으로 분기하여 수행한다.
 jump func : func 함수로 무조건 분기하여 수행한다.

33. 시그널 전송 (signal)
 info signals : 보낼 수 있는 시그널의 종류를 확인할 수 있다.
 signal SIGKILL : 디버깅 대상의 프로세스에게 KILL 시그널을 보낼 수 있다.

34. 메모리의 특정 영역에 값을 설정 ( set )
 set {타입}[주소] = [값] : p 명령 대신에 set 을 통해서 메모리의 특정 주소에 저장하는 것이 더 일반적이다
 set {int}0x8048300 = 100 : 해당 주소에 100의 값을 입력한다.

35. gdb 환경설정 (set)
 info set : 변경 가능한 환경설정 정보를 출력한다.
 info functions : 함수들의 리스트를 출력
 info types  : 선언된 타입에 대한 리스트를 출력
 set prompt psyoblade: : 프롬프트를 psyoblade: 로 변경할 수 있다.
 set print array on : 배열을 출력할 때 한 행에 출력하는 것이 아니라 여러 행에 출력한다.

36. 기타 info 를 통해 알 수 있는 정보들
 address         catch           extensions      handle          objects         set             stack           tracepoints
 all-registers   common          files           heap            program         sharedlibrary   symbol          types
 architecture    copying         float           leaks           registers       signals         target          variables
 args            dcache          frame           line            remote-process  source          terminal        warranty
 breakpoints     display         functions       locals          scope           sources         threads         watchpoints

728x90

레퍼런스 : http://httpd.apache.org/docs/2.0/mod/mod_alias.html



C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\httpd.conf


파일 수정


<IfModule alias_module>

   

    ScriptAlias /cgi-bin/ "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/"


  Alias /{별칭}/ "{절대경로}/"    # 예) Alias /pic/ "D:/PIC/"

  <Directory "{절대경로}/">

          Options MultiViews

          AllowOverride None

          Order allow,deny

    Allow from all

  </Directory>


</IfModule>



아파치 재접속 이후 접속

728x90

해커스쿨에서 컴퓨터와 프로그래밍의 역사 공부

http://www.hackerschool.org/Sub_Html/HS_Community/?Type=Middle&More_Size=-90



텔넷에서 리눅스 공부

http://www.hackerschool.org/Sub_Html/HS_FTZ/html/ftz_menual.html





한글PuTTY



접속형식 Telnet / Host Name : ftz.hackerschool.org





728x90

TCP, 그리고 UDP 쉽게 알아보는 두 개념과 차이점

원문보기: 
http://www.inven.co.kr/webzine/news/?news=165870#csidx4db9516eea5f377b7f80cb9c3f102aa 

728x90


라즈베리 파이, WiringPi를 이용한 GPIO 제어



WiringPi 설치하기전 Git 설치


sudo apt-get install git-core



라즈베리 파이 업데이트

sudo apt-get update

sudo apt-get upgrade



Git을 통해 WiringPi 내려받기

git clone git://git.drogon.net/wiringPi



다운로드 완료 후, 빌드 수행

cd wiringPi

./build




gpio 유틸리티 실행



GPIO 확장보드의 28과 29핀을 쓸 것. (BCM 20, 21)



라즈베리파이 GPIO (General purpose input/output)







74HC08N, Quad 2-input AND gate







LED켜기 

#include <wiringPi.h>
#include <stdio.h>

#define         A       28
#define         B       29

int main(void)
{
        wiringPiSetup();

        pinMode(A,OUTPUT);
        pinMode(B,OUTPUT);

        while(1)
        {
                printf("A = Lo, B = Lo: Out = ?\n");
                digitalWrite(A,LOW);
                digitalWrite(B,LOW);
                delay(1000);

                printf("A = Lo, B = Hi: Out = ?\n");
                digitalWrite(A,LOW);
                digitalWrite(B,HIGH);
                delay(1000);

                printf("A = Hi, B = Lo: Out = ?\n");
                digitalWrite(A,HIGH);
                digitalWrite(B,LOW);
                delay(1000);

                printf("A = Hi, B = Hi: Out = ?\n");
                digitalWrite(A,HIGH);
                digitalWrite(B,HIGH);
                delay(1000);
        }
        return 0;
}



컴파일시 -lwiringPiDev 붙여줘야 함


 pi@raspberrypi:~/wiringPi $ gcc -o Gpio GPIO_RPi.c -l wiringPi 


실행

pi@raspberrypi:~/wiringPi $ sudo ./Gpio



실행결과



 AND GATE이므로 28,29핀에 HIGH 신호가 들어올 때(4번째 PRINTF문) 불이 켜지는 것을 볼 수 있다.

digitalWrite(A,HIGH); digitalWrite(B,HIGH);




LED없이 출력값 보기

#include <wiringPi.h>
#include <stdio.h>

#define    IN  27
#define         A       28
#define         B       29

int main(void)
{
        wiringPiSetup();

  pinMode(IN,INPUT);
        pinMode(A,OUTPUT);
        pinMode(B,OUTPUT);

        while(1)
        {
                printf("A = Lo, B = Lo: Out = ");
                digitalWrite(A,LOW);
                digitalWrite(B,LOW);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);

                printf("A = Lo, B = Hi: Out = ");
                digitalWrite(A,LOW);
                digitalWrite(B,HIGH);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);

                printf("A = Hi, B = Lo: Out = ");
                digitalWrite(A,HIGH);
                digitalWrite(B,LOW);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);

                printf("A = Hi, B = Hi: Out = ");
                digitalWrite(A,HIGH);
                digitalWrite(B,HIGH);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);
        }
        return 0;
}



위 소스 if 문에 대한 설명


1 == digitalRead(IN))             // 1은 참을 의미, 디지털 신호가 들어올 때.

1 =! digitalRead(IN))               // 1이 아닐때는 왼쪽과 같이 소스를 짤 수 있음.



결과 : 두 핀 모두 HIGH일 때, Hi라는 문장이 출력된다.

 printf("A = Hi, B = Hi: Out = ");

digitalWrite(A,HIGH); digitalWrite(B,HIGH); if(digitalRead(IN)) { printf("Hi\n"); }




728x90

TCP의 특징: 신뢰

모든 패킷 전송에 대한 응답확인

패킷마다 일련 번호가 붙음




최대 전송 단위(maximum transmission unit, MTU)란 해당 레이어가 전송할 수 있는 최대 프로토콜 데이터 단위의 크기(바이트)이다.


Eternet환경에서 MTU는 1500 (실제 사용제 data는 최대 1460까지 하나의 패킷으로 전송가능)





TCP/IP 4 계층





• bind : socket을 소프트웨어 Port와 IP로 묶음


커뮤니케이션 - accept가 반환하는 값은 커뮤니케이션의 값



유닉스 고급 프로그래밍 p.385

시그널 - 소프트웨어 인터럽트


자바에서는 이벤트


SIGINT : 터미널 인터럽트 문자, 기본동작은 종료 (p. 393)



foreground process <-> background process


폭주한 프로그램을 종료할 때, 특히 원치않은 대량의 출력을 화면에 표시하는 프로그램 종료시 흔히 쓰임 (예: 무한 while문에서 Ctrl + C)




리눅스 멀티채팅 프로그램


multi chat.7z








728x90

공장내 네트워크



블록킹함수  scanf

논블록킹     printf


연결 지향 : 전용 선로 개설

• Three-way handshake

• 3번의 패킷 교환으로 세션 개설


#include <stdio.h> 
int main()

{
	fprintf(stdout, "TEST \n");
	write(1,"TEST \n", 5);
	char caBuff[250];
	
//	fclose(stdout);

	fprintf(stdout, "TEST \n");
	write(1,"TEST \n", 5);


//	write(1, "\033[1;1H/033[2]", 10);
	read(0, caBuff, 250);
	printf("%s", caBuff);

	return 0;
}


Output :  //주석을 가지고 출력값을 테스트


TEST

TEST TEST

TEST (안녕하세요 입력)

안녕하세요



클라이언트 테스트





main.c  // 네트워크 소켓생성 활용 소스

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>


int main()
{
	int iSock; // socket 함수의 반환값 받아냄
	struct sockaddr_in stServer; //network에 사용될 ip, port번호 저장

 	int iLen;	// 구조체 길이 저장
	char caBuff[250];	// 최대로 읽어들일 버퍼 크기
	int iRet; // 키보드 입력을 읽어들여 저장, iRet=read	 


	//char *inet_ntoa 숫자 입력하면 문자열 반환

	iSock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	
	if(iSock<0)
	{	
		printf("소켓 생성불가 \n");
		return;
	}
	memset(&stServer,0, sizeof(stServer)); //구조체 초기화(bzero와 같은 효과)
    
	stServer.sin_family=AF_INET;	
	stServer.sin_addr.s_addr = inet_addr("192.168.1.55"); //ip 설정
	stServer.sin_port = htons(9999); // 포트번호 설정, 구조체 설정 끝, le->big endian
	
	iLen=sizeof(stServer); // iRen에 구조체 길이 넣어줌
	printf("메시지를 입력하세요 \n");	// app사용자에게 입력상태임을 알려줌
	fflush(stdout);		    
 	iRet=read(0, caBuff, 250);  
	// 첫번째 인자0이면 키보드 입력을 받음, 입력받는 주소 caBuff, 최대 크기 250)
	
	sendto(iSock, caBuff, iRet, 0, (struct sockaddr*)&stServer, iLen);
    // 소켓번호, 데이터가 든곳, 보낼 바이트수, 0, 보내는곳의 정보(구조체 주소), 길이
	// udp로 통신
	close(iSock); // 네트워크 끊김
	return 0;
}


728x90


리눅스와 윈도우간 c언어 파일은 호환되나, 실행파일은 그 운영체제에서만 호환된다.

 

c언어의 호환성

*.c파일을 열어보면 개행문자는 메모장에서는 제대로 처리되지 않지만, 

visual studio 등의 프로그램으로 열면 개행문자가 제대로 처리된 소스를 볼 수 있다.



도스창 명령어


dir >>1.txt

redirection : 출력방향을 1.txt파일로 보냄.  파일을 열어보면 dir의 내용이 들어가있는 걸 볼 수 있다.



copy main.c smart.c     // main.c파일을 smart.c파일로 복사한다.

copy main.c + smart.c  // main.c파일과 smart.c 파일을 합친다. 



type 명령어 : 파일의 내용을 화면에 텍스트로 출력한다. 

type main.c    // main.c의 내용을 화면에 출력

type *.c        // 디렉토리에 있는 모든 *.c파일의 내용을 화면에 출력





리눅스에서 터미널 명령어


리눅스는 명령어가 틀리다. type대신에 cat명령어를 통해 파일의 내용을 화면에 출력한다.




>는 리다이렉션 명령어.


cat a.c b.c > c.c

 cat test2.c>>test.c


cat test2.c >> test.c 명령을 하면 test2.c의 텍스트가 test.c 텍스트 최하단으로 복사된다. 



visual editor 명령어 


J 하면 아래위의 줄이 붙는다. (join)



/ 찾고싶은 키워드


n  다음 찾기


shift n  이전 찾기


:noh  하이라이트 꺼짐




라즈베리파이를 통한 터미널 통신 (non-canonical)



#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>

#define SPEED   B115200
#define SPORT   "/dev/ttyAMA0"


int main(void)
{
    char cBuff[255];

    int iDev = 0;
    int iRet = 0;

    struct termios stOldState;
    struct termios stNewState;

    iDev = open(SPORT, O_RDWR | O_NOCTTY);

    if(0>iDev)
    {
        perror(SPORT);
        exit(-100);
    }

    tcgetattr(iDev, &stOldState);
    bzero(&stNewState, sizeof(stNewState));
    stNewState.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD;
    stNewState.c_iflag = IGNPAR | ICRNL;
    stNewState.c_oflag = 0;
    stNewState.c_lflag = ICANON;
    bzero(stNewState.c_cc, NCCS);
    stNewState.c_cc[VMIN] = 1;

    tcflush(iDev, TCIFLUSH);
    tcsetattr(iDev, TCSANOW, &stNewState);

    iRet = write(iDev, "test\n"5);
    //iRet = read(iDev, cBuff, 255);
    //cBuff[iRet] = 0;
    //printf("[%s]:[%d]\n", cBuff, iRet);
    printf("write complete : %d\n", iRet);

    tcsetattr(iDev, TCSANOW, &stOldState);
    close(iDev);

    return 0;
}



gpio 도면을 보면 8, 10번 핀이 각각 TX, RX임을 알 수 있다.




라즈베리 파이 8,10번핀에 꼽아준다.


결과 : 



test라는 글자를 발신하면 받는 쪽에서 test라는 글자와 함께 글자수가 출력된다. (test\n까지 5글자)

발신이 완료되면 발신완료 문자와 함께 글자수가 출력된다. (write complete : 5)



728x90

지역변수

 

 

 

오른쪽의 예제에서 10번째 행을 주석처리 않았을 때는 if문 내 지역변수 값은 17, main함수내 지역변수 값은 1이 나온다.

6행의 num은 main 함수내에서만 접근 가능한데, if문 내에서 새로운 변수 num이 선언되었기 때문에 if문 내 지역변수 값은 17이 된다. (7+10)

 

주석처리시에는 각각 각각 11, 11이 나온다.

 

 

 

 

위의 예제를 수정해서 각각의 num의 주소를 알아보자.

 

위와 같은 결과가 나온다.

 

 

 

Linux gcc ASLR 해제 ( 랜덤 스택 Random Stack )

 

주소를 고정할때는 다음의 명령어를 친다.

sysctl -w kernel.randomize_va_space=0


이후 출력 되는 메시지

kernel.randomize_va_space = 0  // 0 대신 1을 넣으면 활성화

 

 

unix, linux - 장치를 파일로 간주

/dev 안에 장치들이 모여있음

 

 

리눅스 tty, TeleTYpewriter; TTY리눅스 텔레타이프라이터, 원격타자기

 

c - character 1 바이트

stream 데이터의 크기가 정해지지 않음(최소크기 1바이트)

 

두 가지로 나뉨

character device

block device

 

l - link (바로가기)

심볼릭 링크

하드 링크

 

man ( 알고 싶은것  )  : 리눅스 메뉴얼  // man printf, man fopen

// 섹션3 보려면 man 3 printf

빠져나오려면 q

 

 

vi 자동 정렬

1. 명령모드(esc)로 감
2. gg=G

 

 

'Linux & Network' 카테고리의 다른 글

2016 04-14 소켓  (0) 2016.04.15
20160401_리눅스 터미널 및 통신  (0) 2016.04.01
20160330_리눅스 터미널  (0) 2016.03.30
라즈베리 파이 원격제어와 C언어  (0) 2016.03.28
라즈베리파이 기본 설정  (0) 2016.03.25

+ Recent posts