728x90

나는 랩탑 하나를 우분투를 깔아 쓰고있다 (20.04LTS) 듀얼부트가 아니닷...

위 에러메시지에 대한 다른 해결책이 구글에 많이 나오는데

대부분 서버컴퓨터거나 VM위에 깔아둔 우분투거나 듀얼부팅이거나 해서 나와는 상황이 약간씩 달랐다...

 

근데 루트 용량이 부족하다고 며칠전부터 시위를 해서

쓸데없는 저널같은거 정리좀 해줬더니 또 잠잠하다가.... 다시 경고가 뜨기시작했다

사용량을 보니 써야하는 프로그램들이 자리를 많이 차지해서 자잔한거 지워봐야 소용이없을 것 같았다

 

그래..백업..해놓고 늘려줄게..방법을 찾을게...하다가

홈 디렉터리를 압축해보려했는데 이것도 용량없다고 못하게하고...

( gzip: stdout: No space left on device )

 

 

그러다가...

너무 꽉 차버린나머지

부팅이되지않았다.....

 

아따메... 그래도 일주일에 한번이상 백업해둔 데이터가있기에 일부 날려먹을 각오를 하고

 

부팅 USB를 만들어서 Live mode 로 진입한 다음

GParted 를 이용해 파티션 크기를 조정했다.

 

아래 블로그를 보고 따라했고 Home partition 앞부분을 줄인다음 root partition 을 10G 늘려주었다

 

https://heisanbug.tistory.com/18

 

결과는 아주 성공적! 백업 걱정을 했는데 아직까진 날려먹은것도 없어보인다

 

할일 짱많은데 왜이러는거야 나한테!ㅠ 그래도 잘 해결되서 다행이당

728x90
728x90

본 글은 대학 수업 듣다가 하도 이해가 안돼서 정리하면서 이해해보고자 쓰는 글입니닷

 

Process 들은 분리 된 데이터 영역을 가진다.

 

그치만 우린 그 프로세스 간에 데이터를 주고받고싶을때가 있는 것이다.

 

이를 IPC(Inter-Process Communication)라고 하고 그 수단은 크게 두가지로 나뉘고 또 그 두개에서 세부적으로 나뉜다.

 

내가 수업에서 배운 큰 분류는 다음과 같다.

Message passing
커널이 관리, 동기화 문제 신경쓸 필요X
오버헤드 큼
PIPE
부모-자식 프로세스간 단방향 전송(read or write)
FIFO
부모자식 관계가 아닌 프로세스들도 통신 가능
Shared Memory
메모리 공간을 할당받아 2개 이상의 프로세스들이 같은 메모리공간에 접근함
동기화문제가 생길 수 있다. < 보통 세마포어를 써서 해결

shared memory 관련 system call 사용
MMP
(Memory mapped file) 을 shared memory로 사용

 

PIPE 는 시스템콜 PIPE로 생성할 수 있으며 그냥 파일디스크립터 처럼 read, write 시스템콜을 사용하면 된다.

파일 디스크립터를 복사하는 dup라는 기능도 있다.

이걸 사용하면 STD_OUT에 써지는 내용을 PIPE에도 동일하게 보내거나

STD_OUT은 닫아버리고 모든 출력을 PIPE가 받도록 할 수도 있다.

 

FIFO는 자료구조의 FIFO가 맞다.

프로세스로부터 메시지를 받아 요청이 들어올 때마다 선입선출시킴..

mkfifo 시스템콜로 FIFO를 만들고 그 객체를 open, close, read, write 할 수 있다.

 

Shared Memory 내 머리를 터지게 하는 유용한 기능

사실 쉐어드메모리 개념 자체가 아니라 동기화문제가 구웨엑이다..

서로 다른 둘 이상의 프로세스가 같은 메모리를 함께 사용한다.

일단 관련 시스템콜은 아래와같다.

 

shget :운영체제야 쉐어드메모리 줘 없으면 만들어서 줘!!!

 - shared memory ID 를 리턴.

shmat : Virtual address 에 physical memory 주소 연결해줘!!!(= mapping)

 - 쉐어드메모리의 포인터가 리턴

  그리고 이때 얘가 가리키는 주소에는 flag로 0이 들어있다

shmdt : 연결한거 떼줘!!

 - 정상적으로 수행 시 0 리턴

 

할당해제는 컨트롤 오퍼레이션을 사용한다

shmctl( 쉐어드메모리ID, IPC_RMID, 0 )

두번째 인자로 IPC_RMID 를 주면 system 상에서 shared memory가 사라진다. 옵션은 보통 NULL로 준다. 

 

그리고 Memory mapped file

디스크상의 파일을 Virtual address와 mapping 해서 쓰는것인데

file 에 바로 쓰므로 file I/O와는 다르다...........고 하나

실상 페이지가 메모리에서 내려갈 때 변경사항이 반영되므로 File I/O와 섞어쓰다가는 동기화문제가 생긴다고 한다.

 

 

관련 시스템콜은

mmap : VA를 할당

munmap: 할당 해제

이 있다.

mmap 은 파라미터가 좀 복잡하다고 느껴지는데... 순서대로

mapping할 address : 0추천 > 시스템이 알아서 고름

사이즈

prot : PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE

flag : offset, 보통 0 넣으면 됨

 

이렇게 4개가 들어간다

 

끝!

 

 

 

 

728x90
728x90

실습 코드에

close(1); <<요런 라인이 있었다..

 

1이 뭐여?

 

알고보니 unistd.h 에서 사용하는 파일디스크립터(file descriptor)의 매크로이당.. ( POSIX API의 일부란다)

 

매크로란 인수형 등의 인자를 쉽게 기억하기(?) 위해

또는 코드 가독성을 올리기위해 사용하는 것...

아래 표의 첫번째칸 값을 넣으나

세번째칸 값을 넣으나 똑같다는 것이다

보통 C에서 대문자로 표현된당..

 

 

고로 close(1) 은

스탠다드 아웃풋 디스크립터를 닫는다 즉, 더이상 본 프로세스에서 표준 출력을 쓰지 않겠다 라는 것이다.

close(0) 은 표준입력을 받지 않겠다는 것이다.

위 세개의 파일 디스크립터, 스트림은 open을 따로 하지 않아도 프로세스 생성 시 자동으로 생성된다.

 

자동으로 생성되는 것에 대한 내용은 여기에 썼었다.. 물론 구글에 더 좋은 글이 많을 것이당

 

2021.10.30 - [프로그래밍 공부/OS] - [Linux] 표준 입력, 표준 출력, 표준 에러 출력, 파일디스크립터

 

[Linux] 표준 입력, 표준 출력, 표준 에러 출력, 파일디스크립터

리눅스 공부하면서... 이해한걸 또 까먹을까봐 내식대로 적어두려함 출처는 학교 리눅스 수업 + 모두를 위한 리눅스 프로그래밍(아오키 미네로, 2018) 이다. 컴퓨터는 기본적으로 1차원 바이너리

holsui.tistory.com

 

 

나는 close(1) 이녀석 행색이 맘에안들어서

close(STDOUT_FILENO) 으로 변경하였따....

 

 

참고자료 : 오늘 날 도와준 위키피디아 땡큐!

 

728x90
728x90

*Ubuntu 20.04 에서 컴파일했습니당..

 

 

빌드시 아래 메시지가 뜬다면....

pthread library 가 제대로 링크 되지 않은것이다...

 

undefined reference to 'pthread_cancel'

undefined reference to `pthread_create'

undefined reference to `pthread_join'

 

이거 배워놓고 자꾸 잊어먹는다...

 

pthread.h 를 포함하고 pthread 관련 함수 사용시

compile 시 -lpthread 옵션을 꼭 넣어주어야한다!

 

make file 작성시에는

CC = gcc
CFLAGS =
LDFLAGS = -lpthread


[target] : [prerequisites(.o file 등)]

        $(CC) -o $@ $< $(LDFLAGS)

 

요렇게 작성하면 되고

 

직접 컴파일할때는

 

gcc -o [target] [소스코드] -lpthread

 

이렇게 옵션 넣어주면 된다...

 

그러나 lpthread 말고 pthread 옵션을 넣어도 되는데

둘의 차이는

lpthread 는 pthread 라이브러리와 링크만 해주고

pthread 는 라이브러리 링크+매크로 사용이 가능하다.

그래서 pthread 사용을 추천하는 글이 많다...

그러나 pthread 옵션은 운영체제에 따라 동작하지 않을 수 있다... 아마 그래서 내 실습자료도 lpthread 옵션을 사용한듯허당!

 

 

출처 :

728x90
728x90
더보기

「Linux, system call, operating system, asynchronus programming, 비동기 프로그래밍


오늘은 학교 과제하다가 잘 복습해두고픈 내용이 있어서 써본다

Linux system programming 수업에서 요즘 Signal 부분 과제를 하고있다...

오늘 실습한 코드는signal(알람수신자) 과 alarm(알람발신자) 을 사용해서 동기적 프로그래밍하기!

나를 혼란스럽게 했던 내용...
* signal 은 signal 보내는게 아니라 받는 함수다 ㅡㅡ .... 진짜 넘하지않냐....
* 뭐..안넣어도 세상이 워낙 좋아 컴파일이 되긴했지만 alarm 사용을 위해 unistd.h 헤더 포함시켜주기...
*signal인터페이스

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

첫번째 인자 signum 은 MACRO를 사용한다 ( SIGINT, SIGBUS,SIGALRM,SIGTERM 등...)
(man signal 참고*)
두번째 인자는 함수 포인터이다... 위 형식에 맞게 함수를 선언하고 넣어주면 된다.

첫번째 인자에 해당하는 signal 을 받으면 두번째 인자의 함수가 실행된다.
default 동작도 있다(무시, 종료 등..)


흐름은....
1. alram signal 을 받았을 때(alarm 함수를 통해 'SIGALRM' 시그널 보냄) 어떤 동작을 수행할지 변경하기위해
SigAlarmHandler 함수를 만든다.(이 함수가 signal 의 두번째 인자, 함수 포인터로 들어간다)
SigAlarmHandler :
여기에는 점을 하나 찍어주는 코드와
signal을 다시 호출하는 코드가 들어간다.
( 여기에서 또 두번째 인자로 핸들러를 재귀적으로 넣어주는데, 일부 운영체제에서 핸들러는 한 번 수행된 뒤 초기화되기 때문이다...)

2. 최초로 signal 을보낼 setPeriodicAlarm 함수를 선언해준다.
signal함수로 SIGALRM 받았을 시의 Handler를 설정해주고
alarm() 호출! 파라미터는 시간이 들어간다 (unsigned int, 초단위.. )
0이면 pending 중인 모든 알람이 취소된다

3. main 에서 setPeriodic Alarm 을 호출한다...

그러면 다른 동작이 모두 종료될때까지 반복해서 alarm handler 에 등록한 내용이 주기적으로 수행된다.

실습코드

#include <stdlib.h> #include <stdio.h> #include <signal.h> #include <unistd.h> static unsigned int AlarmSecs; // 함수 종료시에도 값 유지되는 전역변수 // static : 다른 파일 접근을 막기 위함 // void SigAlarmHandler(int signo) { // 한 번 호출 후 Hanlder 사라지는 OS가 있으므로 // 재귀적으로 재등록 if( signal(SIGALRM, SigAlarmHandler) == SIG_ERR) { perror("signal"); exit(1); } // 다시 알람 시스템 콜 요청 // 전역변수 사용(함수가 사라지므로) alarm(AlarmSecs); /* DO something */ // 버퍼캐시 바로 flush printf("."); fflush(stdout); return; } int SetPeriodicAlarm(unsigned int nsecs) { if( signal(SIGALRM, SigAlarmHandler) == SIG_ERR) { return -1; } // 정상종료 시 -1 return AlarmSecs = nsecs; alarm(nsecs); return 0; } int main() { int i,j; printf("Doing something every one sec.\n"); // 1초마다 정해진 동작 하는 함수(asynchronus) SetPeriodicAlarm(1); //위 알람과 상관없이 자기 일 하는 코드.. // asynchronuos 함을 더 직접적으로 보기 위해 내맘대로 넣어본 yum! for(i = 0;i < 1000000;i++){ if( i%100000 == 0) printf("\nyum!\n"); for(j = 0; j<20000; j++) {} } return 0; } 67,1 Bot


어마어마한루프는... 일부러 시간끌기용으로 넣어보았다 숫자는 별의미없음

수행결과는 이렇게 나왔당


끝!

참고한것 :학교수업자료, 아오키미네로 「모두를위한 리눅스 프로그래밍」, man alarm

728x90
728x90

리눅스 공부하면서... 이해한걸 또 까먹을까봐 내식대로 적어두려함

 

출처는 학교 리눅스 수업 + 모두를 위한 리눅스 프로그래밍(아오키 미네로, 2018) 이다.

 

컴퓨터는 기본적으로 1차원 바이너리를 읽는다.

따라서 모든 데이터는 1차원으로 바뀌어서 흐른다... 이것을 스트림이라고 할 수 있다.

 

프로세스가 하나 생성되면 해당 프로세스에 3개의 스트림이 자동으로 생성되는데,

이것이 표준입력, 표준출력, 표준에러출력이다.

이들은 각각 0,1,2 의 디스크립터(ID같은것?)를 갖는다. 그치만 그걸 유저에게 외우라고 하진않고....!

STDIN_FILENO, STDOUT_FILENO , STDERR_FILENO 라고 매크로를 지정하여뒀으니 이걸 넣어서 인자로 주고받을수있다

 

이것은 컴퓨터의 중요한 개념인 추상화(abstraction)를 내포하고있는데

내 프로세스는 이 표준입력이 파일에서 온건지 키보드로 친건지는 신경쓰지 않고 똑같이 처리할 수 있다.

표준 출력을 내보낼 때도 마찬가지다. 이걸 모니터에 쓰든 다른 프로세스로 전달하든 알바가 아닌것이당......

 

암튼 이 스트림들을 우리는 수많은 입출력이 포함 된 API 를 통해 간접적으로 쓰고있지만

시스템콜로 직접 호출하려면

unistd.h 헤더를 포함하고, read, write를 사용하면 된다.

write 를 쓰려면

문자열(char []) buf 를 선언하고(당연 변수명은 달라도 됨)

write(STDOUT_FILENO, buf, sizedof(Buf)-1);

 

위와같이 하면 된다.

 

buf는 우리가 흔히 '버퍼링 걸린다' 고 할때의 버퍼인데 (이말도 안쓴지 10년넘긴한듯...) 암튼....

저렇게 하면 buf 에 들어있는 문자열이 표준출력으로 나온다! ( 터미널에 찍힘 ) 파이프로 연결해서 다른데로 보낼수도있다..

 

 

해당내용은 위에 언급한 책 64~71 페이지를 읽어보면 더 자세하고 정확하게 나온당......끗!

728x90
728x90

학교 리눅스 수업 과제로
makefile 에 각 줄이 무엇을 의미하는지 주석을 달아 업로드하는 과제가 있었는데
scp를 이용해 업로드를 하려니 저런 오류가 떴다....

결론적으로 나는 포트 옵션을 잘못 넣어서 저렇게 뜬거였음



위 오류가 나는 이유는 크게

1. ㄹㅇ 경로가 없음 > mkdir 명령어로 폴더를 만들어 주도록 하자
2. 명령어 오류 > 아주 단순 오타일수도 있고... 나처럼 옵션을 잘못 넣었을 수도... 나는 포트를 -P 포트번호 이렇게 넣어야하는걸
P- 포트번호 이딴식으로 잘못넣었었다 하하... ㅠㅠ
3. 포트오류 > 내가 실습용으로 이용하는 서버는 22번 포트가 닫혀있어 매번 포트번호를 넣어줘야하는데 가끔 이상한 숫자를 넣곤한닫....하하

결국 내가 성공한 명령어는 아래와 같다

scp -P 포트번호 /home/경로경로/파일이름 유저네임@서버 : /서버내저장할경로/경로/


이렇게 하고 권한 확인을 위한 비밀번호를 넣으니 업로드가 완료되었다!

scp manual 과
참고한 링크를 첨부하며 글 마무리...

728x90
728x90

공부한거 복습해보기

근데 여기는 내용이 많아서 다 적진않을것이당...

복습용이므로 설명이 다소 캐주얼...ㅎㅎ

그래도 리눅스를 시작하는 사람이 본다면 도움이 될것임... 초보입장서 쉽게쉽게 써놨으니깐 하하

 

0. manual

리눅스 커멘드들의 설명서를 볼 수 있는 커멘드...

옵션들에 대해서도 다 나온다

$ man [궁굼한커멘드]

요렇게 치면 되고 ( [ ] 는 빼고...!!)

1. shell command ( 현재 까만화면에 치는 커멘드...)

2. system calls ( 유저모드에서 커널모드로 진입하기 위한 API들 )

3. library function

얘네는 이름이 중복될 수 있는데

걍 검색하면 세가지가 다 나오고...

첫번째 인자로 1,2,3 을 넣으면 해당 섹션의 설명만을 보여준다 ( BSD style.. )

-s1 < 이런식으로 옵션 넣어줘도 됨

구글링이 워낙 편한 세상이지만 공식 문서를 읽으며 공부하는게 도움이 많이 된다고 교수님께서 강조하셨다...

예시) man man / man man 1 / man ls 1 / man ls -s1

 

1. file system 관련

 

$ ls -al              : 목록 보기, 현 위치에있는 파일, 디렉토리들 보여줌 -al은 숨김파일( . 으로 시작하는) 도 보여주는 옵션

$ mkdir 뫄뫄     : 뫄뫄라는 이름의 directory 만들기

$ cd 뫄뫄           : 뫄뫄 dir 로 이동하기, 반대로 dir에서 나갈때는 .. 을 치면 된다

$ rmdir 뫄뫄      : 뫄뫄라는 dir 삭제

$ pwd               : print working directory 현재 작업 중 디렉토리 표시

그 외에

cp (copy), rm(remove), ln(link, 바로가기나 실행파일 만들기), mkfs (make file system), fsck (file system check), mount, du 에 대해 간략히 설명을 들었다..

 

 

2. File 관련

 

 |    << 요 길쭉이는 파이프 라고 부르는데 어떤 커멘드의 결과로 나오는 아웃풋을 다른 명령어의 인풋으로 넘겨준다

파일관련 커멘드에서 많이 쓰이므로 알고있는게 편하다... 키보드 상 원화표시 있는곳에 있음

 

$ vi 파일이름                : 파일 수정 (vi editor를 사용함... 첨에 이것두 모르고 막 리눅스 갖고놀다가 미아 됐었던... 쓰는법은 또 워낙 기니까 vi 단축키로 구글링 해보기!!)

$ cat 파일이름              : 파일 내용 보기 

                    .... 왜 cat 인지 궁굼해서 manual 을 보니 'concatenate files and print on the standard output' 라고함

$ more 파일이름           : 내용을 페이지 단위로 보여줌, 보통 파이프( | )로 출력을 넘겨서 쓰는듯..?

$ grep 문자열 찾을위치 : 인자가 2개다.. 2번째 인자로 주어진 위치 또는 파일에서 첫번째 인자의 문자열을 찾는다

                  보통 다른 명령어 뒤에 파이프로 이어서 결과내에서 검색하기 목적으로 사용한다..

 

 

그 외에 diff, head, tail, find, wc, od 등을 배움

 

 

3. Process 관련

 

$ ps            : 실행중인  프로세스(이하 ps) 들의 정보를 보여줌

젤 중요한건 맨앞에 나오는 프로세스아이디...

 

 

4. 기타

 

$ su - 유저이름  : switch user, 다른 유저로 작업

$ sudo              : super user 권한으로 (다른 유저) 커멘드 실행

ㅋㅋㅋㅋ어디서 sudo = 제발 이라는 밈들을 봤는데 제법 웃겻음ㅋㅋㅋ

 

5. File archive (압축이라든지..)

$ tar              : 여러 파일을 하나로 묶음... 옵션이 많으니까 man 쳐보기..

$ compress  : 요즘은 잘 쓰지 않지만 압축 명령어.. 

$ gzip           : compress 보다 많이 쓰이는 압축 명령어

 

근데 gzip 말고도 종류가 많고... 우분투 GUI 에서 편하게 zip 압축도 잘 되긴함

 

 

아이고 힘들다... 리눅스 시작하기 챕터 정리(?) 끝!

그래도 다시 보고 쳐보고 하면서 복습  마니함...

 

728x90

+ Recent posts