본문 바로가기
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.
백준 9996 한국이 그리울 땐 서버에 접속하지 (문자열) 문제선영이는 이번 학기에 오스트레일리아로 교환 학생을 가게 되었다. 호주에 도착하고 처음 며칠은 한국 생각을 잊으면서 즐겁게 지냈다. 몇 주가 지나니 한국이 그리워지기 시작했다. 선영이는 한국에 두고온 서버에 접속해서 디렉토리 안에 들어있는 파일 이름을 보면서 그리움을 잊기로 했다. 매일 밤, 파일 이름을 보면서 파일 하나하나에 얽힌 사연을 기억하면서 한국을 생각하고 있었다.어느 날이었다. 한국에 있는 서버가 망가졌고, 그 결과 특정 패턴과 일치하는 파일 이름을 적절히 출력하지 못하는 버그가 생겼다.패턴은 알파벳 소문자 여러 개와 별표(*) 하나로 이루어진 문자열이다.파일 이름이 패턴에 일치하려면, 패턴에 있는 별표를 알파벳 소문자로 이루어진 임의의 문자열로 변환해 파일 이름과 같게 만들 수 있어야 한다.. 2024. 9. 2.
프로세스 간 통신(파이프, 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.
백준 11655 : ROT13 문제ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다.예를 들어, "Baekjoon Online Judge"를 ROT13으로 암호화하면 "Onrxwbba Bayvar Whqtr"가 된다. ROT13으로 암호화한 내용을 원래 내용으로 바꾸려면 암호화한 문자열을 다시 ROT13하면 된다. 앞에서 암호화한 문자열 "Onrxwbba Bayvar Whqtr"에 다시 ROT13을 적용하면 "Baekjoon Online Judge"가 된다.ROT13은 알파벳 대문자와 소문자에만 적용할 수 있다. 알파벳이 아닌 글자는 원래 글자 그대로 남아 있어야 한다. 예를 들어, "One is 1"을 ROT13으로 암호화하면 "Bar vf 1"이 된다.문자열이 주어졌을 때, "ROT13"으로 암호화한 다.. 2024. 8. 28.
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.
split 메서드 구현하기 c++에는 split 메서드가 없다#include #include using namespace std;vector split(const string& input, string delimiter) { vector result; auto start = 0; auto end = input.find(delimiter); while (end != string::npos) { result.push_back(input.substr(start, end - start)); start = end + delimiter.size(); end = input.find(delimiter, start); } result.push_back(input.substr(s.. 2024. 8. 27.
조합 구하기 재귀를 이용한 조합 구하기 dfs처럼 방문 체크를 해주면서 k개가 될때까지 계속 재귀를 돌기#include #include using namespace std;int n = 5, k = 3, a[5] = {1, 2, 3, 4, 5};void print(vector b){ for (int i : b) cout &b){ if (b.size() == k) { print(b); return; } for (int i = start + 1; i b; combi(-1, b); return 0;} -- 반복문을 이용해서 구하기n이 2개면 2중, 3개면 3중 for문..n이 많아질수록 비효율적이된다 2024. 8. 27.
순열 구하기 - next_permutation, 재귀 반복문으로 next_permutation 메서드를 이용해서 가능한 순열의 갯수를 구할 수 있다next_permutation메서드 안에 시작점, 끝점을 넣어주고 do - while 문으로 돌면 해당 배열 안의 원소들이 가능한 경우의 수 만큼 배치된다 ! 그냥 while 문의 경우 마지막 순열을 계산한 후 더 이상 계산할 순열이 없으므로 순열내 원소를 출력하지 않고반복문이 종료되버린다 , do-while 문을 사용 ! 오름차순을 기준으로 순열을 만들기때문에 정렬된 상태로 메서드를 호출해야한다int main() { int a[] = {1,2,3}; do{ for (int i : a) { cout  -- 재귀를 이용한 방식using namespace std;int a[.. 2024. 8. 27.
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.