티스토리 뷰
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으로 바꾸었다. (오타 만들기)


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되었거나, 접근 오류인 경우에 발생하는 오류라고 한다.
'OS > 리눅스' 카테고리의 다른 글
| Ubuntu16.04 - 괄호 실습 (0) | 2020.12.15 |
|---|---|
| Ubuntu16.04 stdio - redirection 개념 및 pipe 실습 - 실행 안되는 문제 해결 (0) | 2020.12.15 |
| Ubuntu16.04 - systemd default target 변경 (0) | 2020.12.13 |
| Ubuntu16.04 /etc/fstab 설정 (0) | 2020.12.12 |
| Ubuntu16.04 ~/.vimrc 생성 (0) | 2020.12.12 |
- Total
- Today
- Yesterday
- filesystem
- C++
- 윈도우
- ROS
- roslaunch
- 백준알고리즘
- 아두이노 IDE
- Python
- 윈도우 복구
- umount
- 프로그래머스
- 우분투
- Publisher
- VMware
- VirtualBox
- sensehat
- Mount
- subscriber
- 리눅스
- 포트인식문제
- Ubuntu20.04
- set backspace
- Ubuntu16.04
- 초음파센서
- 코드리뷰
- 8자주행
- python3
- vue/cli
- 원격 통신
- HC-SR04
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
