티스토리 뷰

1. C언어로 작성된 코드 예제

1) 정상범위 리턴값

make helloworld : 컴파일하는 명령어

./helloworld : 실행파일 실행 명령어

$? : 바로 이전 명령어의 리턴 코드 가져오는 변수.

 

2) 리턴값 오버플로우

2340을 리턴하라고 했지만, 실제로 36을 리턴하였다. 이것은 main함수는 int로 리턴하는데 64비트 컴퓨터에서 int는 32비트이다. 그런데, 이 32비트를 다 사용하지 못하고, 실제로는 8비트만 사용할 수 있다. 0~255만 리턴 가능. 그래서 2340을 리턴시키면 오버플로우가 발생하여 2340 (b 1001 0010 0100)의 하위 8비트 36 (b 0010 0100)이 출력된 것이다.

 

3) 음수 리턴값

또한  -1을 리턴하도록 하면 0이전의 255를 리턴한다.

만약 -2를 리턴하도록 하면 0보다 2개 전의 254를 리턴한다.

즉 음수 -x (x는 양수)를 리턴하도록 하면 256-x의 하위 8비트가 리턴된다.

 

2. 외부 명령 리턴 코드

touch가 실행되면 뒤의 파일이 있으면 새로 갱신, 없으면 0byte크기의 빈 파일을 생성한다.

qwer파일을 만들고 두번 삭제하였다.

첫번째 rm에서는 잘 실행되어 0이 리턴되는데, (정상종료)

두번째 rm에서는 삭제할 파일이 없어서 1이 리턴된다. (비정상종료)

 

※ rm -f

rm의 매뉴얼을 확인하면 아래와 같다.

즉, 리턴값을 무시하면서 remove를 실행하고 싶은 경우에 사용한다.

실행 결과를 확인하면, ls명령어로 qwer파일을 찾았을 때 존재하지 않지만, remove명령을 실행해도 에러 메세지가 출력되지 않는다. $?변수로 종료코드를 확인해도 0이 출력된다. (정상종료)

 

3. make 예제

rm의 force옵션은 Makefile에서 사용되는 기능이다.

make : 어떤 규칙을 만들어놓으면, 자동으로 명령어가 실행되는 것. ex) 소스코드 컴파일

아래와 같이 Makefile이란 이름의 파일을 작성한다. 아래에서 @echo, rm, @echo 앞의 공백은 띄어쓰기가 아니라 tab키 한 번으로 띄운 것이다.

 

1) rm 명령어

make를 두번 실행하였을 때, 첫번째 make는 잘 동작하지만, 두번째 make는 오류가 발생한다. rm명령이 실패했기 때문.

그래서 두번째 echo를 실행하지 않는다. 즉, 두번째 줄 (rm명령어)에서 종료된 것.

 

2) rm -f 옵션

이럴 때, rm 에서 -f 옵션을 사용하면, 정상 종료되어 두번째 echo도 실행하는 것을 볼 수 있다.

ec (exit code) = rc (return code)

 

4. systemctl 명령어 리턴코드

sysstat unit으로 테스트.

 

systemctl status sysstat

sysstat 유닛이 설치되어 있는지 확인하는 명령어

yum -y install sysstat
apt -y install sysstat

RedHat계열은 위 명령어로, Debian계열 (우분투 포함)은 아래 명령어로 설치한다.

 

systemctl enable --now sysstat

이 명령어를 실행했을 때, 제대로 실행이 안됐었던 것 같다. 그래서 컴퓨터를 끄고 몇시간 뒤에 실습을 재개했는데 지금은 잘 된다. 이유는 모름..

 

1) 정상 종료

systemctl의 1회성 service는 exit code를 가진다.

 

systemctl status sysstat

명령어로 확인하면 아래 결과 화면이 나온다.

sysstat은 일회성 서비스로, 종료되었다. 여기서 code=exited(종료됨), status=0 : 이것이 리턴 코드이다. 즉 정상종료됨을 알 수 있다.

 

2) 비정상 종료.

고의로 systemd의 error상황을 만들어보았다.

systemctl cat sysstat.service

위 명령어를 수행하여 sysstat에 대한 정보를 확인하였고, ExecStart=/etc/init.d/sysstat 이다. 해당 경로를 오픈하여 sa1을 sa100으로 바꾸었다. (오타 만들기)

/etc/init.d/sysstat에서 오타만들기. 원래는 sa1이다.

 

daemon을 reload하고, sysstat을 restart 한다. 마지막으로 status를 확인한다.

원래 두번째 명령어, restart부터 비정상 종료되어야 하는데, 나는 정상종료되었다.

 

무슨 일인가 싶어 /etc/init.d/sysstat 문서를 다시 살펴보았다.

daemon파일은 /usr/lib/sysstat/ 에 위치하는 것 같고, 해당 파일이 있는지 테스트를 진행한다.

/usr/lib/sysstat/ 를 ls 명령어로 확인하였다. 분명 debian-sa100은 없는데, 왜 정상 종료되는 것인지 모르겠다.

 

원래 결과는, status sysstat.service를 진행했을 때 code=exited이고, status에서 exit-code값이 203이 잡힌다.

man systemd.exec에서 매뉴얼을 확인한다.

203은 EXIT_EXEC으로, 해당 파일이 missing되었거나, 접근 오류인 경우에 발생하는 오류라고 한다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함