우리가 흔히 아는 방법은

터미널에서 vs code를 열려면 

vs code에서 

cmd + shift + p 를 누르면 

위의 창을 누르면 되는 것으로 알고 있는데 

맥은 이것을 한 번 누르면 딱 한번만 적용 되고 다시 껐다 키면 적용이 되지 않는다.

리눅스는 바로바로 code . 누르면 적용 되는데...

단축키는 정말 간단하게 code . 이다.

code .

본인이 쓰는 쉘(shell)에 따라서 bashrc나 zshrc를 수정해줘야한다.

쉘이란 명령어를 처리하는 명령프롬포트 같은 그런 것이다. 

 

일단 나의 맥은 기본적으로 bashrc를 사용하므로 bashrc 기준으로 정리하겠다.

터미널에 

ls-a 를 입력하면 숨은 파일까지 모두 출력된다.

ls-a

이제 .bash_profile 파일을 수정할 것이다.

vim .bash_profile

i를 누르면 vim에디터의 입력모드로 전환이 된다. 

그 후에 맨 마지막 줄에 

code () { VSCODE_CWD="$PWD" open -n -b "com.microsoft.VSCode" --args $* ;}

를 입력하고 esc 누르고 :wq를 누르면 저장된다.

source ~/.bash_profile

바꾼 bash_profile 적용시켜주면 끝! 

이제 우리는 code . 라는 간단한 단추키로 터미널에서

간지나게 vs code를 오픈 할 수 있을 것이다!

// 원하는 폴더에서
code .

이것은 정석적인 방법이고 더 간단한 방법으로는 

open -t .bash_profile

똑같이 bash_profile을 열고 (텍스트편집기로 열림)

bash_profile 파일에 똑같이 아래의 코드를 입력해주면 된다고 한다!!

code () { VSCODE_CWD="$PWD" open -n -b "com.microsoft.VSCode" --args $* ;}

 

정보의 출처 : stackoverflow 

// STEP 1. 라즈베이파이 마이크로sd굽기설치

1. 라즈베이파이에 방열판달고

SD리더기에 SNADISK꼽고 컴퓨터USB연결

구글 라즈베이파이OS 검색후 imager_1.6.2설치
https://www.raspberrypi.org/software/

SD카드에 라즈베이32bit usb선택, write굽기

 

-- [생략 가능] 그냥 전원 꼽으면 자동으로 os 설치 됨. -- 




// STEP 2. 라즈베이파이 부팅 //
1. 키보드 마우스 모니터 USB로연결.
(!) 전원연결은 항상 마지막.


// STEP 3. 내부 세팅 //
1.와이파이 연결
국가 -UK로 세팅

2.왼쪽위아이콘(설정)
설정-기본설정 Raspbeery pi configuration - 
시스템 - hostname - password설정 toDesktop, autologin on ,wait ,enable
디스플레이 D D E
인터페이스 EEEEE D (E) E D
퍼포먼스 GPU 128

3. update upgrade, 한글설치
"rasberry pi hangul jow1025" 검색
https://jow1025.tistory.com/273
사이트 내 터미널에서 절차 진행

(!)터미널에서 ~ 안쳐지거나 키보드문제시 언어설정 확인 [한글 102], [hangul]

4.에디터 설치 vim,gedit
sudo apt install vim
sudo apt install gedit

5.응용소프트웨어 비주얼스튜디오 설치
sudo apt install code
*기본실행방식 설정-개발-visual Studio code

6.vnc
*오른쪽상단에 VNC아이콘으로 실행
ip 192.168.x.x아이피확인


// STEP 4. 메인컴퓨터 네트워크 연결 //
https://www.realvnc.com/en/connect/download/viewer/
1. 본 PC에서 VNC viewer 검색 윈도우용 다운 설치

2. cmd에서 ip확인 (*2개잡히는문제)

3. 메인컴퓨터와 공유기연결.

4. VNC VIWER 실행후에 같은 공유기의 와이파이에 연결되있는 라즈베이파이 선택
본인이 설정했던 라즈베리아이디*****(안되면pi) 비밀번호*****

리눅스처럼 화면공유한 상태로 사용.





// 기본 opencv파일 받기 //
"opencv 4로 배우는 컴퓨터 비전과 머신 러닝 github" 검색
git clone https://github.com/sunkyoo/opencv4cvml





// STEP 1. opencv설치 //
1.  "raspberry pi opencv설치" 검색후 맨위
"webnautes.tistory.com/916"
3.2 부터 opencv설치
3.3 이미지 라이브러리 설치
3.4 비디오 코덱라이브러리 설치
3.5 실시간영상받아올 비디오4리눅스 설치
3.6 파일 영상읽고/쓰기 Gstreamer패키지 설치
3.7 윈도우 GUI 설치
3.8 OpenGL 설치
3.9 최적화라이브러리 설치
3.10 파이썬 설치(안뜨면넘김)

2. 소스받기
폴더생성 mkdir opencv 폴더내에서
4.2, 4.3 소스다운 둘다 알집해제
4.5 빌드파일생성
4.6 opencv-4.5.1/build/에서 긴문장실행해서 전부다운
// 스왑별로효과없음 
// 4.9 sudo gedit으로 열어서 스왑고치기 CONF_SWAPSIZE=2048
// free쳐보고 $ ~restart부분실행후 free다시확인
4.10 CPU 4개쓰기
time make -j4  
(runningtime 54min47sec......)
4.11 make설치 빌드->빌트타겟으로 복사
5.1 현재위치로 코드를 가져옵니다 (복사)
cp~ 복사,뒤에추가 
cp /usr/local/share/opencv4/samples/cpp/videocapture_basic.cpp ~/blackBox/ 



// STEP 2. 실행 //

5.1(2)편집기vim이나 gedit로 vim videocapture_basic.cpp 로 열기
int apiID = cv::CAP_V4L2; 부분수정

5.1(3)컴파일
g++ videocaptue_basic

5.1 실행
./videocaptue_basic

카메라 연결 확인

수정후에 컴파일
g++ -o videocapture_basic videocapture_basic.cpp $(pkg-config opencv4 --libs --cflags)

프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이고,

스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다.

 

1. 멀티 프로세스(Multi Process)

- 컴퓨터가 프로그램을 처리하는 과정을 프로세스라고 하는데 이 과정에서

프로세스에 각각 일련의 번호가 주어진다. PID (Process Identification Number) 이다.

fork()함수를 사용한다. 부모 프로세스를 PPID(Parent Process Identification Number)라고 부른다.

 

- 개념  

두 개 이상의 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(TASK)을 동시에 처리하는 것이다.(병렬처리)

각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용 

 

 

2. 멀티 스레드 (Multi Thread)

- 멀티 프로세스와는 다르게 프로세스 1개에 여러개의 멀티 스레드가 들어갈 수 있다.

정확하게는 한 프로세스에 stack이 여러 개로 나누어서 데이터를 처리하는데 이것을

멀티 스레드라고 한다. 

 

★ 스레드를 컴파일 할 시에 명령어 

gcc -o pthred pthread.c -lpthread

스레드가 포함 된 c언어는 끝에 -lpthread를 붙여야 컴파일이 가능하다. 

 

 

3. 메세지 큐

- 하나의 프로세스로부터 다른 프로세스로 데이터의 블록을 전달하는 IPC의 하나 

- 각 데이터 블록은 type을 가짐. 

 

- 쓰이는 함수 

int msgget(key_t key, int msgflg)

주요 기능 : 메세지 큐 생성, 액세스

parameters 

1) key : 메세지 큐 명명 

2) msgflg 

   - IPC_PRIVATE : 프로세스 전용 큐

   - IPC_CREAT : 허용 플래그 포함. or 연산 (0666 | IPC_CREAT)

return value 

 - 성공 : 큐 식별자

 - 실패 : -1 

 

int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

주요 기능 : 메세지 추가

parameters 

1) msgid : 메세지 큐 식별자

2) msg_ptr : 전달되는 메세지에 대한 포인터

3) msg_sz 메세지 크기

4) msg_flag 큐가 가득 차거나 큐에 저장되는 메세지에 대한 시스템 버위의 제한에 도달 시 

발생 이벤트 제어 

  - IPC_NOWAIT : 메세지 전달하지 않고 즉시 반환

  - null : 큐의 공간이 유효할 때까지 대기 

return vlaue 

- 성공 : 0

- 실패 : -1

 

int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

주요 기능 : 메세지 큐로부터 메세지를 구함

parameters 

1) msg_sz 메세지 크기 

2) msgtype : 간단한 형태의 우선권 지정 

 =0 큐에서 처음으로 유효한 메세지

 >0 같은 메세지 형태를 가지는 첫 메세지

 <0 같은 형태의 메세지 or msgtype의 절대값보다 적은 첫 메세지 

return value

- 성공 : 버퍼에 저장된 바이트 수 반환, msg_ptr에서 가리키는 사용자 할당의 버퍼로 복사되며, 데이터 메세지는 큐로부터 삭제 

- 에러 : -1 반환 

 

int msgctl(int msqid, int command, struct msqid_ds *buf);

주요 기능: 메세지 큐 제어 함수 

parameters 

1) command : 수행할 동작 

- IPC_STAT : 메세지 큐와 관련된 값을 반영하기 위해 msqid_ds 구조체에서 데이터 설정 

- IPC_SET : 프로세스가 허용 권한을 가진다면 메세지 큐와 관련된 값을 msqid_ds 데이터 구조체에 제공 되는 것을 설정

- IPC_RMID : 삭제

return value

- 성공 : 0

- 실패 : -1

4. 공유 메모리 

- 컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리이다.

int shmget (key_t key, size_t size, int shmflg);

주요 기능 : 공유 메모리를 만든다. 

return value

성공 : a non negative integer 

실패 : -1 

 

void *shmat (int shm_id, const void *shm_addr, int shmflg);

parameters

1) shm_flg

- SHM_RND : in conjunction with shm_addr, controls the address at which the shared memory is attached 

- SHM_RDONLY : makes the attached memory read-only

return value 

성공 : a pointer to the first bytes of shared memory

실패 : -1

 

int shmdt (const void *shm_addr);

주요 기능 : detaches the shared memory from the current process 

return value

- 성공 : 0

- 실패 : -1 

(detaching은 공유 메모리를 지우는 것이 아니다. 잠시 비활성화 상태로 만드는 것이다.)

 

int shmctl (int shm_id, int command, struct shmid_ds *buf)

주요 기능 : 공유메모리를 통제한다.

parameters

1) command  

- IPC_STAT : 메세지 큐와 관련된 값을 반영하기 위해 msqid_ds 구조체에서 데이터 설정

- IPC_SET : 프로세스가 허용 권한을 가진다면 메세지 큐와 관련된 값을 msqid_ds 데이터 구조체에 제공 되는 것을 설정

- IPC_RMID : 삭제

return value

- 성공 : 0

- 실패 : -1 

5. 시그널 

1. 사용자가 터미널에서 특수문자를 누르는 경우

- 인터럽트 문자 control+c , control +z

 

2. 하드웨어 예외가 발생한 경우 

- 하드웨어 이벤트가 발생하여 커널에 통보하고, 커널이 해당 시그널을 관련된 프로세스에 보냅니다.

 

3. 소프트웨어적 조건

- 네트워크 데이터 오류 (SIGURG), 파이프 작업에서의 오류 (SIGPEPE), 알람시계의 종료(SIGALRM) 등 

 

표준 시그널 

Signal Description Default Action
SIGABRT 프로세스 중단  구현에 따라 틀림
SIGALRM 알람 알림 비정상 종료
SIGBUS 정의되지 않은 메모리 영역 접근 구현에 따라 틀림
SIGCHLD 자식의 종료, 중단, 계속 무시
SIGCONT 중단되었다면 재시작한다. 계속
SIGFPE 0으로 나누는 것과 같은 산술연산 에러 구현에 따라 틀림
SIGHUP 제어 터미널(프로세스)의 중단(종료) 비정상 종료 
SIGILL 잘못된 하드웨어 명령어 구현에 따라 틀림
SIGINT 양방향 주의 시그널(보통 CTRL+C) 비정상 종료
SIGKILL 종료(처리되거나 무시될 수 없음) 비정상 종료
SIGPIPE 읽기 주차게 없는 파이프에 쓰기 비정상 종료
SIGQUIT 대화형 종료: 코어덤프(보통 CTRL+\) 구현에 따라 틀림
SIGSEGV 잘못된 메모리 접근 구현에 따라 틀림
SIGSTOP 실행 중지(처리되거나 무시될 수 없음) 중지
SIGTERM 종료 비정상 종료
SIGTSTP 터미널 중지 중지
SIGTTIN 백그라운드 프로세스가 읽기를 시도 중지
SIGTTOU 백그라운드 프로세스가 쓰기를 시도 중지
SIGURG 소켓에 높은 대여폭 데이터가 유용함 무시
SIGUSR1 사용자 정의 시그널 1 비정상 종료 
SIGUSR2 사용자 정의 시그널 2  비정상 종료

 

시그널 속성

- signal()의 handler 인자로 함수의 주소 대신 다음 값 중 하나를 명시할 수 있다.

1) SIG_DFL

시그널 속성을 기본 값으로 재설정

시그널 속성을 변경한 signal()의 이전 호출의 영향을 무효화 할 때 유용

2) SIG_IGN

시그널을 무시한다. 커널은 조용히 해당 시그널을 폐기한다. 프로세스는 그 시그널이 발생했는지 절대 알지 못한다. 

 

시그널 관련 함수

Signal Handling - signal()

Sending signals - kill(),alarm()

Robust signal interface - sigaction()

signal sets - sigaddset(), sigemptyset(), sigfillset(), sigdelset(), sigismember() , etc... 

6.  IPC(InterProcess Communication) 

- 프로세스 사이에 데이터를 주고 받는 일. 프로세스 간 통신은 실제로 한 컴퓨터 내의 프로세스 간보다도 네트워크 상의 객체 사이에 데이터를 주고 받을 수 있도록 설계된 것이 많다. 

7. POSIX

- POSIX (Portable Operating System Interface)(포직스) 이식 가능 운영 체제 인터페이스

서로 다른 유닉스 OS의 공통 API를 정리하여 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적.

규격의 내용으로 커털로의 C언어 인터페이스인 시스템콜, 프로세스 환경, 파일과 디렉토리, 시스템 데이터베이스, tar 압축 포맷 등 다양한 분야를 아우른다.  

 

 

오늘의 결론 - pdf파일 및 구글링 잘 참고하고 ~ 깃허브 잘 참고하고~ 

함수 사용법 및 내장함수 구별하고 인자별 특징 및 어떤 것을 return 하는 지 잘 찾아보자잉! 

 

+ Recent posts