본문 바로가기
tcp 채팅 프로그램 1. 사용하려는 서버 측에 mysql을 설치.. 하려고 했으나 라파이에서 mysql이 설치 불가능해 mariadb 설치sudo apt-get install libmariadb-dev 2. 컴파일 할때 MySQL 클라이언트 라이브러리 사용을 명시라파이 컴파일aarch64-linux-gnu-gcc -o tcpServer tcpServer.c -I/usr/include/mariadb -L/usr/lib/aarch64-linux-gnu -lmariadb gcc -o server tcpServer.c -lmysqlclient  3. 테이블 구조CREATE TABLE messages ( id INT AUTO_INCREMENT PRIMARY KEY, client_socket INT, text VARC.. 2024. 9. 13.
0906 웹서버 부팅시 실행 • 부팅시 웹 서버 자동 실행 리눅스 환경[Unit]Description=webserver[Service]ExecStart=/home/ubuntu/webserver/web 8000Type=simpleWorkingDirectory=/home/ubuntu/webserver[Install]WantedBy=multi-user.target/etc/systemd/system 폴더에 webserver.service 파일을 만들고 아래 내용을 작성  sudo systemctl daemon-reload  sudo systemctl start webserver  sudo systemctl status webserver curl 명령어로 실행한다 curl http://127.0.0.1:8000/index.html?led=o.. 2024. 9. 6.
프로세스 간 통신(파이프, ipc) 프로세스 간에는 공유되는 부분이 없기에 별도의 방법이 필요하다 • 파이프 부모, 자식 프로세스 간의 통신을 위해서 사용한다#include #include #include #include #include #include int main(){ int pfd[2]; pipe(pfd); // pfd[0] - read, pfd[1] - write 하는 파이프 printf("%d, %d\n", pfd[0], pfd[1]); char buf[] = "hello parent"; char buf2[1024]; int n; switch (fork()) { case -1: perror("fork error"); exit(1); break;.. 2024. 8. 29.
0828 프로세스, 블로킹/논블로킹 • fork 메서드 fork 메서드를 이용해서 프로세스를 복제fork가 불린 시점부터 프로세스가 분화하고부모는 자식의 pid를 알게되고자식은 fork의 결과가 0이 된다fork == -1 이면 결과가 비정상적인 것 fork로 대부분의 정보가 복제되고fork 리턴값, 파일 잠금, 알람,시그널, 프로세스 진행 시간은 초기화된다#include #include #include static int g_Var = 1;char str[] = "PID";int main(){ __pid_t pid = fork(); int cpid = pid; switch (cpid) { case -1: perror("Fork"); exit(1); break; .. 2024. 8. 28.
0827 파일락, 링크, stat, 디렉토리, 시간, 프로세스, 시그널 • 파일락 예제 멀티프로세스 환경에서 락을 걸어두면 파일에 접근 못하게 하는 파일락 예제#include #include #include #include int file_lock(int fd);int file_unlock(int fd);int main(){ int fd; int count = 0; if((fd=open("flock.txt", O_CREAT | O_RDWR, 0644)) == -1){ perror("open"); exit(1); } //파일 락 설정 if(file_lock(fd)== -1){ perror("file_lock"); exit(1); } int n; if((n=read(fd, &cou.. 2024. 8. 27.
라즈베리파이 크로스컴파일 설정 라즈베리파이가 아닌 원격 우분투에 세팅을 한다!gcc와 g++ 컴파일러 버전은 맞춰두자 sudo apt install binutils-aarch64-linux-gnusudo apt install gcc-12-aarch64-linux-gnusudo apt install g++-12-aarch64-linux-gnu -- bashrc에 크로스컴파일 옵션 등록alias armgcc=aarch64-linux-gnu-gcc-12 alias armg++=aarch64-linux-gnu-g++-12 -- 등록한 컴파일 옵션으로 컴파일 한 다음 scp 명령어로 전송한다armgcc dup.c -o dup file dup scp dup 2024. 8. 26.
0826 리눅스 시스템 프로그래밍 • 시스템 콜과 라이브러리 함수 차이  시스템 콜은 사용자가 malloc 등으로 메모리 할당하는게 필요라이브러리 함수는 라이브러리 함수에서 메모리 할당해서 malloc 없이도 사용 가능 • perror#include #include #include int main(){ int fd = 3; if(write(fd, "hello", 5) == -1){ perror("write"); exit(1); } close(fd); return 0;} 일부러 오류가 나게 작성한 코드시스템 콜을 사용했을때 -1이 리턴되면 오류가 생긴 것perror을 이용해서 오류를 출력한다perror에 인자로 전달한 write: Bad file descriptor가 리턴된다 • 환경 변.. 2024. 8. 26.
시험대비 qt c++ 복습 • 시작하기#include "mainwindow.h"#include #include int main(int argc, char *argv[]){ QApplication a(argc, argv); QLabel *hello = new QLabel("Hello Worild!"); hello->show(); hello->resize(1280,720); hello->move(100,100); return a.exec();} Qlabel을 이용해서 heelo worid 출력하기 • qt 이벤트 처리qpushbutton을 이용해서 이벤트 처리 버튼 클릭시 시그널을 이용해서 종료 이벤트 호출 QPushButton *btn = new QPushButton("btn",0); bt.. 2024. 8. 25.
시험대비 c++ 복습 • 디폴트 매개변수메서드 선언할때 기본 값을 미리 넣어두는 방식a = 5, b= 5 형태로 a,b값을 둘다 미리 넣어두었다b만 디폴트 값을 지정하는 방식은 가능하지만a만 지정해두는 식으로는 사용 불가능하다void star(int a = 5, int b = 5) { cout  • friend 키워드외부 함수나 멤버함수, 클래스를 프렌드로 선언하면 자유롭게 접근할 수 있다class Test{ int a = 5; int b = 10;public: friend void show(Test t); Test(int a, int b){ this->a = a; this->b = b; } Test(){};};void show(Test t){ co.. 2024. 8. 25.
시험대비 C 복습 • 입력char str3[20];fgets(str1, 20, stdin);scanf("%[^\n]s", &str3); 공백 구분해서 입력받는 방법 2가지fgets(입력받을 문자열, 받을 문자열 길이, stdin);scanf("[^\n]%s", &입력받을 char[길이]);  scanf("%[^ ]s", &str3);  • 배열 입출력 int* 로 받지만 int arr[10] 형태로 선언한 배열도 입출력 가능하다 int score[10];void scoreEnter(int* score) { for (int i = 0; i  • malloc선언 후 메모리 널 체크 한 다음 사용, 사용후 반드시 메모리 해제int main(void) { int *arr = malloc(sizeof(int) * 20); .. 2024. 8. 23.
라이브러리 정적 라이브러리, 동적 라이브러리  컴파일 시점:정적 라이브러리: 컴파일 시 라이브러리 코드가 실행 파일에 포함됨.동적 라이브러리: 컴파일 시 라이브러리 참조만 포함되고, 실행 시 로드됨.배포:정적 라이브러리: 별도로 라이브러리를 배포할 필요 없음.동적 라이브러리: 라이브러리를 별도로 배포하거나, 시스템에 미리 설치되어야 함.파일 크기:정적 라이브러리: 실행 파일 크기가 큼.동적 라이브러리: 실행 파일 크기가 작음.유연성 및 유지보수:정적 라이브러리: 라이브러리 수정 시 프로그램을 다시 컴파일해야 함.동적 라이브러리: 라이브러리를 교체하면 프로그램을 다시 컴파일하지 않아도 됨.- 동적 라이브러리 예제 공유 라이브러리를 handle에 지정해주고dlsym으로 지정해둔 메서드를 가져와서 사용할 수 있다#inc.. 2024. 8. 22.
0822 gdb, core, valgrind • gdb 디버깅 ulimt -a 로 core file size를 확인해보면 기본으로 0, core 파일이 생성되지 않는다ulimit -c unlimited로 설정해두면 core 파일이 생성된다 gdb ./main core.19963 생성된 코어와 함께 gdb 디버거를 호출하면 bt를 입력하면 코어가 터진 해당 라인이 호출된다 • valgrind make로 만든 파일을 valgrind로 실행하면 메모리 누수에 관련된 것을 디버깅 할 수 있다valgrind --leak-check=full ./example5 example5를 실행했을때  아래 주석처리한 delete을 살리면이중 delete가 되어서 할당보다 해제가 많은 경우가 된다#include using namespace std;int*memAlloc(.. 2024. 8. 22.
보이드 포인터, 함수 포인터 복습 • 보이드 포인터  void *ptr; int tmp = 10; ptr = &tmp; printf("%d", *(int *)ptr);보이드 포인터로 선언하고 보이드포인터  = 특정 자료형 으로 대입한 후(특정 자료형 *) 형태로 가져와서 쓸 수 있다 #include void print_first_element(void *arr, char type) { if (type == 'i') { printf("첫 번째 정수형 요소: %d\n", *((int*)arr)); } else if (type == 'f') { printf("첫 번째 실수형 요소: %f\n", *((float*)arr)); } else { printf("알 수 없는 타.. 2024. 8. 21.
리눅스 쉘 스크립트 조건문 -n 문자열이 비어있지 않으면 true-z 문자열이 비어있으면 truea -gt b 정수 a가 b보다 크면 truea -lt  b 정수 a가 b보다 작으면 truea -eq b 정수 a와 b가 같으면 true 2024. 8. 21.
리눅스 쉘 프로그래밍 • SED - 비대화형 편집기sed 's/apple/banana_milk/g' test.txt test.txt 에서 apple을 banana_milk로 치환 - 내용 추가해서 쓰기 • AWK일반 스크립트 언어awk -F':' '{ print $1, $3 } ' /etc/passwd /etc/passwd 파일의 첫번째, 세번째 필드만 가져오기 awk -F':' '/^root/, /^news/ { print $1, $3 } ' /etc/passwdroot 부터 news 까지의 1,3 필드만 가져오기awk -F':' '$3 >= 1000 { print $1, $3 } ' /etc/passwd세번째 필드의 값이 1000 이상인 값만 가져오기$ ls -l | awk '/^-/ {print $9 $5}'-로 시작하.. 2024. 8. 20.
리눅스 명령어 정리 & 예제 • alias로 단축 명령어 등록clear 명령을 c를 입력하면 실행 가능하게 등록하고 , 등록한 c를 취소한다alias c = clear unalias calias  rm=‘rm -i  • grepgrep 검색할내용 검색할 위치grep user /etc/passwd 이렇게 하면 user를 포함하는 라인을 /etc/passwd 파일에서 검색한다 • 파이프• .bashrc로그인 할때마다 수행되는 파일 bash에 사용자가 설정하는 alias 파일을 등록하는 명령어echo "alias c=clear" >> ~/.bashrc 로 등록하고source ~/.bashrc 하면 재로그인 없이 즉시 반영된다-- rm 명령어 좀더 안전하게 쓰기echo "alias rm='rm -i'" >> ~/.bashrc source .. 2024. 8. 17.
0812 리눅스 • 환경virtualbox + extension packubuntu 24.04  • 리눅스 명령어 - alias alias 별칭=명령어 형태로 명령어에 별칭을 추가 가능alias c=clearunalias c clear 명령어를 c라는 별칭으로 등록하고 등록한 별칭 c를 없애는 코드 - 백그라운드 작업명령 끝에 &를 붙여서 여러 명령 동시에 수행 가능 - 파이프 & 리다이렉션  명령이나 프로그램 수행 결과를 다른 명령어나 프로그램으로 전달 ps > ps.txt ps 명령어 결과를 ps.txt에 저장한다 - 환경변수export PATH=/bin:/usr/bin:/sbin:/usr/sbin환경변수를 변경 - 초기화 스크립트.bashrc 파일이 로그인할때 자동으로 실행된다 echo "alias c=clear".. 2024. 8. 12.
0808 Qt 메세지박스, 자료구조 • QMessageBox위와 같은 알림 창을 만들기슬롯을 선언하고 슬롯에서 QMessageBox::question 메서드를 호출해서 어떤 창을 띄울건지를 구현한다void QtEditor::help(){ QMessageBox::question(this,"QMessageBox::showQuestion()", "Qusetion Message", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);} • 파일 입출력void QtEditor::openFile(){ QString filename = QFileDialog::getOpenFileName(this, "select file to open", ".", "Text File(*.txt *.c .. 2024. 8. 8.
0807 QT 에디터 & 액션 • 에디터#include "qteditor.h"#include #include #include #include QtEditor::QtEditor(QWidget *parent): QMainWindow(parent){ QTextEdit *text = new QTextEdit(this); setCentralWidget(text); //상단에 메뉴바 생성 QMenuBar *bar = new QMenuBar(this); setMenuBar(bar); //메뉴바에 메뉴 넣기 QMenu *fileMenu1 = bar->addMenu("&파일"); QMenu *fileMenu2 = bar->addMenu("&편집"); QMenu *fileMenu3 = bar->addMe.. 2024. 8. 7.
0805 QT C++ 다양한 ui, 시그널 • QT 시작qt console app 으로 프로젝트 시작cmake 빌드 -프로젝트 생성해서 디버그 찍어보기#include int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); qDebug("Hello Qt"); qDebug()  - 온클릭 이벤트#include #include #include int main(int argc, char *argv[]){ QApplication a(argc, argv); QWidget w; QLabel hello(" Hello Qt! ",&w); hello.resize(75,35); QPushButton quit("quit",&w); quit.move(10,40.. 2024. 8. 5.