분할 오류를 일으킨 명령 주위에 while 루프를 구축합니다.

분할 오류를 일으킨 명령 주위에 while 루프를 구축합니다.

특정 상황에서 분할 오류가 발생하는 프로그램이 있습니다. 분할 오류가 발생했을 때 데이터를 처리하는 명령을 실행한 다음 다시 명령을 실행하고 분할 오류가 멈출 때까지 이 작업을 계속하고 싶습니다.

의사코드에 대한 대략적인 시도로서,

dodgy_command

while SegFault
         dataProcessing
         dodgy_command
end

Trap 명령을 사용해야 할 것 같은데 명령 구문을 이해하지 못합니다.

답변1

프로그램이 비정상적으로 종료되면 종료 코드(셸에서 볼 수 있음)에는 일반적으로 높은 비트가 설정되어 있으므로 값이 128 이상입니다. 따라서 간단한 해결책은 다음과 같습니다.

dodgy_command

while [ $? -ge 128 ]
do
  process_data
  dodgy_command
done

다른 종류의 오류가 아닌 segfault만 원하는 경우 while 라인이 됩니다 $? -eq 139(SEGV는 신호 11, 128+11=139이기 때문).

실패 시 높은 값의 종료 코드를 얻지 못하면 애플리케이션 자체가 오류를 포착하고 다른 종료 코드를 강제로 적용하고 있음을 의미할 수 있습니다.

답변2

이를 수행하기 위해 어떤 언어를 사용해야 하는지 언급하지 않았습니다. 그래서 쉘 스크립트를 사용한다고 가정합니다.

당신 말이 맞습니다. 당신은 함정을 사용하고 싶습니다. Bash의 트랩은 신호가 수신될 때 문자열을 실행해야 합니다. 나는 신호를 잡았을 때 무엇을 해야 할지 명확하게 정의할 수 있도록 함수 호출로 만드는 경향이 있습니다.

다음은 샘플 스크립트입니다.

#!/bin/bash

# define the function that will handle the trap
sigSegFault() { echo "Inside sigSegFault"; }

# Trap the Segmentation Violation (signal 11) signal
trap sigSegFault SEGV

# Start infinite loop    
while [[ true ]]; do
  sleep 10
done

exit 0

간단하지만 요청한 내용의 기본 사항이 포함되어 있습니다.

관련 정보